在java本机接口中调用DeleteLocalRef

ssk*_*ssk 7 java java-native-interface android

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

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

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

Eoi*_*oin 18

不,它不会,但是您的代码将在早于ICS的Android版本上运行.从ICS上这段代码将正确失败.

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

该规则的例外是如果你创建了很多它们,也许是在一个循环中.然后可以填充本地参考表.请参阅IBM:JNI对象引用概述.

您应该阅读ICS中的JNI本地参考更改.即使您不是为Android编写,它仍然会识别许多常见错误.