jni- 释放对象数组

San*_*eep 5 java java-native-interface

在 jni 中,我们有GetPrimitiveArrayElements函数来获取指向堆上数组元素的指针并ReleasePrimitiveArrayElements删除数组的本地副本。

但是我将 java 对象数组传递给 JNI。这些数组元素使用GetObjectArrayElement函数迭代到本地 jobject。

但是如何在处理数组元素后删除 jobject 的本地引用。

谢谢

Nit*_*x88 4

无论jobject您获取的 s 最初是在 Java 端分配的还是由您的 JNI 方法分配的,只要没有对对象的延迟引用,它们就会被垃圾回收处理。因此,如果您对 s 的本地引用jobject只是局部变量,它们将在函数末尾消失,并且您的对象将有资格在事件的正常原因中进行垃圾回收。如果您保留GlobalRef对象,则该对象仍然存在,并且本地引用将像任何未分配堆空间的本地变量一样消失)。如果您保留 a WeakRef,则该对象可能会被垃圾回收,但如果没有,它对于另一个 JNI 调用仍然有效。保留对跨 JNI 调用的普通本地引用jobject是无效的。

jobject另外,如果您想立即释放本地引用而不是等待(就像您在单个函数中创建大量引用一样,只需使用DeleteLocalRef(env, jobj);JNIEnv.

无论如何,如果我犯了任何错误,文档应该告诉您您需要知道的一切。