在java本机接口中调用DeleteLocalRef

时间:2013-05-18 00:07:33

标签: java android java-native-interface

我从JNI方法返回一个jstring。我在返回值之前删除了对它的本地引用。

JNIEXPORT jstring JNICALL TestJNIMethod( JNIEnv* env, jclass )
{
    jstring  test_string = env->NewStringUTF( "test_string_value" );
    env->DeleteLocalRef( test_string );
    return test_string;
}

调用JAVA方法是否仍然能够访问返回的jstring,或者垃圾收集器是否会清理内存?

1 个答案:

答案 0 :(得分:18)

不,它不会,但是您的代码可以在早于ICS的Android版本上运行。从ICS开始,此代码将正确失败。

通常,您不需要自己删除本地引用,一旦JNI函数返回到Java,引用将获得GC。

该规则的例外情况是,如果您创建了很多这些规则,可能是在循环中。然后可以填充本地参考表。请参阅IBM: Overview of JNI object references

您应该阅读JNI Local Reference Changes in ICS。即使您不是为Android编写,它仍然会识别许多常见错误。