我想在C中分配一些内存,并使其与Java对象实例相关联,如下所示:
void configure(JNIEnv *object, jobject obj, ....) { char *buf = new char[1024]; // associated <buf> with <obj> somehow }
然后在Java对象被垃圾回收时释放内存-我可以通过从Java对象的 finalize() 方法调用JNI函数来实现。
问题是,如何将C指针与java对象关联?在对象中保留一个 长 字段并将指针强制转换为 long ?有没有更好的办法?
通常,如果要将指针从C转移到Java,建议使用,long以便在平台为64位的情况下,有足够的位来保存指针值。
long
然后,看看ByteBuffer.allocateDirect()哪个ByteBuffer实例创建了一个可以与C共享内存的实例。您可以ByteBuffer从Java端分配这样的直接指令,然后将其作为A jobject传递给JNI函数,并在此JNI函数内部使用该GetDirectBufferAddress函数。
ByteBuffer.allocateDirect()
ByteBuffer
jobject
GetDirectBufferAddress
另一种方法是NewDirectByteBuffer从本机端使用JNI函数包装内存的本机区域。它使您jobject可以回到Java端(注意本地和全局引用)。请注意以下事实:一旦ByteBuffer创建了包装本机内存的直接目录,您仍需负责管理本机内存:在某些时候,您将必须调用delete buf;本机代码,Java不会为您完成此操作。
NewDirectByteBuffer
delete buf;