Java JNI - 将C中分配的资源与java对象相关联?

Vik*_*tor 7 c c++ java java-native-interface android-ndk

我想在C中分配一些内存并使其与java对象实例相关联,如下所示:

void configure(JNIEnv *object, jobject obj, ....) {
  char *buf = new char[1024];
  // associated <buf> with <obj> somehow
}
Run Code Online (Sandbox Code Playgroud)

然后在java对象被垃圾收集时释放内存 - 我可以通过从java对象的finalize()方法调用JNI函数来实现.

问题是,如何将C指针与java对象相关联?在对象中保留一个字段并将指针强制转换为?有没有更好的办法?

Gre*_*osz 16

通常,如果要将指针从C传输到Java,建议使用long以便在平台为64位时有足够的位来保存指针值.

然后,看看ByteBuffer.allocateDirect()哪个创建了一个ByteBuffer可以与C共享内存的实例.您可以ByteBuffer从Java端分配这样的直接,然后将其作为jobjectJNI函数传递给JNI函数,并使用该GetDirectBufferAddress函数.

另一种方法是使用NewDirectByteBuffer本机端的JNI函数包装内存的本地区域.它会让jobject您传回Java端(注意本地和全局引用).注意这样一个事实:一旦ByteBuffer创建了包装本机内存的直接,你仍然负责管理本机内存:在某些时候,你将不得不调用delete buf;你的本机代码,Java将不会为你做.