我已经在世界各地搜索过,知道如果它是在JNI代码中创建的话我们应该删除LocRef 那么,如果对象是由Java代码新建并返回的话,我是否也应该删除它?如:
// in java code
public SomeObject funcInJavaCode() {
return new SomeObject();
}
// in jni code
funcInJNI {
jobject obj = env->CallObjectMethod(...);
...
// do i have to delete the obj here???
env->DeleteLocalRef(obj);
}
感谢
答案 0 :(得分:2)
没有。当本机函数返回到Java时(Java调用本机时)或调用线程与JVM分离(在本机调用Java中)时,本地引用是垃圾收集的。只有当您拥有长期存在的本机函数(例如,主循环)或在循环中创建大量瞬态对象时,才需要显式DeleteLocalRef
。
答案 1 :(得分:0)
您肯定无法删除返回对象的本地引用,因为该调用将释放对该对象的引用。例如
jbitmap = invokeObjectJavaMethod("MFImageToNative", "([B)Landroid/graphics/Bitmap;", byte_array);
env->DeleteLocalRef(jbitmap);
return jbitmap;
会崩溃,我相信该方法的消费者有责任处理释放参考资料。我某种灵魂可以提供如何做到这一点的澄清,我将非常感激。