12 messages in net.java.dev.jna.usersRe: [jna-users] Buffer arguments as p...
FromSent OnAttachments
Albert StrasheimAug 22, 2007 3:47 pm 
Wayne MeissnerAug 22, 2007 4:19 pm 
Albert StrasheimAug 22, 2007 4:39 pm 
Wayne MeissnerAug 22, 2007 5:33 pm 
Albert StrasheimAug 22, 2007 5:47 pm 
Wayne MeissnerAug 22, 2007 6:13 pm 
Albert StrasheimAug 22, 2007 6:21 pm 
Albert StrasheimAug 22, 2007 6:26 pm 
Wayne MeissnerAug 22, 2007 8:05 pm 
Albert StrasheimAug 23, 2007 3:25 pm 
Wayne MeissnerAug 23, 2007 4:32 pm 
Albert StrasheimAug 23, 2007 4:50 pm 
Actions with this message:
Paste this link in email or IM:
Paste this link in email or IM:
Atom feed for this thread
Paste this URL into your reader:
Subject:Re: [jna-users] Buffer arguments as pointer-to-bufferActions...
From:Wayne Meissner (wmei@gmail.com)
Date:Aug 22, 2007 5:33:53 pm
List:net.java.dev.jna.users

Albert Strasheim wrote:

Hello

Unless I'm mistaken, ByteBuffer#asFloatBuffer() returns a FloatBuffer that throws UnsupportedOperationException when you call array(), so there's no way for me to get a float[] from this kind of buffer without copying.

There's no way to get a float[] without copying.

The JVM doesn't appear to support mapping a region of native memory to primitive arrays - it all has to go through a DirectByteBuffer, and be accessed via ByteBuffer.get(), ByteBuffer.asFloatBuffer() and friends.

Thus, it would be useful if I could pass these kinds of buffers directly to JNA.

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.