我想要来分配某些存储器在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方法是不可靠的清理资源的一种手段。请参阅这个问题获得进一步的细节。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top