当我使用 JNI 方法构建 java 对象时,为了将它作为参数传递给我使用 JNI 调用 API 调用的 java 方法,我如何管理它的内存?
这是我正在使用的内容:
我有一个 C 对象,它的析构函数方法比free()
. 这个 C 对象将与一个 Java 对象相关联,一旦应用程序完成了 Java 对象,我就不再需要 C 对象了。
我正在像这样创建 Java 对象(为清楚起见,省略了错误检查):
c_object = c_object_create ();
class = (*env)->FindClass (env, "my.class.name");
constructor = (*env)->GetMethodID (env, class, "<init>", "(J)V");
instance = (*env)->NewObject (env, class, constructor, (jlong) c_object);
method = (*env)->GetMethodID (env, other_class, "doSomeWork", "(Lmy.class.name)V");
(*env)->CallVoidMethod (env, other_class, method, instance);
那么,既然我已经完成了instance
,我该怎么办呢?理想情况下,我想把垃圾收集留给虚拟机;当它完成时,instance
如果它还调用c_object_destroy()
我提供给它的指针,那就太棒了。这可能吗?
一个单独但相关的问题与我在这样的方法中创建的 Java 实体的范围有关;我是否必须手动释放,比如说,,,class
或constructor
以上method
?JNI 文档在正确内存管理的主题上令人沮丧地模糊(根据我的判断)。