(JNI)是java代码返回的对象需要DeleteLocalRef吗?

时间:2013-09-02 07:34:13

标签: java-native-interface

我已经在世界各地搜索过,知道如果它是在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);
}

感谢

2 个答案:

答案 0 :(得分:2)

没有。当本机函数返回到Java时(Java调用本机时)或调用线程与JVM分离(在本机调用Java中)时,本地引用是垃圾收集的。只有当您拥有长期存在的本机函数(例如,主循环)或在循环中创建大量瞬态对象时,才需要显式DeleteLocalRef

答案 1 :(得分:0)

您肯定无法删除返回对象的本地引用,因为该调用将释放对该对象的引用。例如

    jbitmap = invokeObjectJavaMethod("MFImageToNative", "([B)Landroid/graphics/Bitmap;", byte_array);

    env->DeleteLocalRef(jbitmap);

    return jbitmap;

会崩溃,我相信该方法的消费者有责任处理释放参考资料。我某种灵魂可以提供如何做到这一点的澄清,我将非常感激。