Etienne Gagnon writes:
> Andrew Haley wrote:
> > Sure. Instead of putting a native pointer in a long or in a byte[],
> > you just declare a class with a single field that contains the
> > pointer. Everyone who needs a pointer makes a suitably named
> > subclass, so they'll know what they're pointing to.
>
> How is that more efficient than a byte array?
It's a heck of a lot *better* than a byte array. Whether it's more
efficient or not depends on the design of your VM.
class SomeRandomLibraryClass
{
static
{
System.loadLibrary("SomeRandomJNILibrary");
}
private RandomPointer extends nativePointer;
private native RandomPointer initNativeData(...);
private native void someNativeMethod(RandomPointer nativePointer, ...);
public SomeRandomLibraryClass(...)
{
...
nativePointer = initNativeData(...);
}
public void someMethod(...)
{
someNativeMethod(nativePointer, ...) /** THE REAL CALL **/
}
}
In the C code, we'll have:
> JNIEXPORT void JNICALL
> Java_somepackage_someNativeMethod
> (JNIEnv *env, jobject this, jbyteArray nativePointer, ...)
>
> {
> void *ptr;
> (*env)->GetByteArrayRegion(env, nativePointer, 0, sizeof(void *), (jbyte *)
> &ptr);
Danger, Will Robinson! This is not legal C!!!! You can *not* take
the address of a pointer and cast it to a jbyte*.
Try finding a legal way to do this.
Andrew.
_______________________________________________
Classpath mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/classpath