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

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

void configure(JNIEnv *object, jobject obj, ....) { char *buf = new char[1024]; // associated  with  somehow } 

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

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

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

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

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

Java没有任何本机指针的概念,因此将其存储为long是唯一真正的选择。 但你不应该依靠finalize来释放指针; finalize方法作为清理资源的手段是不可靠的。 有关详细信息,请参阅此问题 。