7

我想在 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字段并将指针转换为long?有没有更好的办法?

4

2 回答 2

16

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

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

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

于 2010-01-04T09:27:36.390 回答
0

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

于 2010-01-04T09:24:20.157 回答