Java JNI-将资源分配的C java的对象?
-
22-09-2019 - |
题
我想要来分配某些存储器在C和保持它的相关java目实例,这样的:
void configure(JNIEnv *object, jobject obj, ....) {
char *buf = new char[1024];
// associated <buf> with <obj> somehow
}
然后免费存储时java object得到垃圾收集到的-我可以做到这一通过调用JNI功能 最后确定() 方法的对象。
问题是,如何关联C指java对象?保持 长 领域中的对象,把指针指向 长?是否有一个更好的办法?
解决方案
一般来说,如果你想要传递一个指从C至Java,它建议使用 long
因此,有足够的位举行指针价值的情况下平台64位。
那么,看一看 ByteBuffer.allocateDirect()
它创建了一个 ByteBuffer
实例,其中存储器可以是共享与C.你可以拨出这样一个直接的 ByteBuffer
从Java边然后把它作为一个 jobject
一JNI功能和内部这JNI功能的使用 GetDirectBufferAddress
功能。
另一种方式是结束本地区的记忆 NewDirectByteBuffer
JNI能从当地一边。它给你一个 jobject
您传回的Java侧(注意地方和全球参考文献)。注意到一个事实,即一旦直接 ByteBuffer
这包裹的机存储器已经建立,你仍然负责管理当地存储器:在某一点上,你会得到呼叫 delete buf;
在你的母码、Java不会为你做它。
其他提示
Java没有本机指针的任何概念,所以将其存储为一个长是唯一的选择。但是,你不应该依赖finalize
释放的指针; finalize方法是不可靠的清理资源的一种手段。请参阅这个问题获得进一步的细节。
不隶属于 StackOverflow