10

我已经在世界各地搜索过,如果它是在 JNI 代码中创建的,我们应该 DeleteLocalRef
,如果对象是新的并由 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);
}

谢谢

4

2 回答 2

5

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

于 2013-09-02T07:51:18.197 回答
0

您绝对不能删除返回对象的本地引用,因为该调用将释放对该对象的引用。例如

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

    env->DeleteLocalRef(jbitmap);

    return jbitmap;

会崩溃,我相信它的消费者有责任处理释放引用。我的一些好心人可以澄清如何做到这一点,我将不胜感激。

于 2014-07-22T18:52:17.297 回答