一尘不染

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

java

我想在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 ?有没有更好的办法?


阅读 281

收藏
2020-12-03

共1个答案

一尘不染

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

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

另一种方法是NewDirectByteBuffer从本机端使用JNI函数包装内存的本机区域。它使您jobject可以回到Java端(注意本地和全局引用)。请注意以下事实:一旦ByteBuffer创建了包装本机内存的直接目录,您仍需负责管理本机内存:在某些时候,您将必须调用delete buf;本机代码,Java不会为您完成此操作。

2020-12-03