Hello
The best I can do is make something like this work:
interface Foo extends Library {
void some_function(FloatBuffer fb);
}
which would be equivalent to:
interface Foo extends Library {
void some_function(float[] fb);
}
That _should_ pass the array directly to JNI - depending on whether the VM
supports/can pin the array. If not it will copy to/from a native buffer
and pass that on. If your native code depends on the address of the array
not changing, that will break, but otherwise it should be fine.
Looks like it almost works. However, I don't think this check in r216 of
Function is quite right:
else if (arg instanceof Buffer) {
if (!(arg instanceof ByteBuffer) || !((ByteBuffer)arg).isDirect()) {
I think any direct buffer can be passed through, so it should probably
simply be:
else if (arg instanceof Buffer) {
if !((Buffer)arg).isDirect()) {
Also, it would be useful if I could write the function in the interface as:
void foo(Buffer buf);
and have it accept any direct buffer. Also, all the other variants should
also work, e.g.,
void foo(FloatBuffer buf);
As far as I can tell, the tests don't cover these cases yet.
Thanks again for the rapid response to this feature request. :-)
Cheers,
Albert