我从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,或者垃圾收集器是否会清理内存?
答案 0 :(得分:18)
不,它不会,但是您的代码可以在早于ICS的Android版本上运行。从ICS开始,此代码将正确失败。
通常,您不需要自己删除本地引用,一旦JNI函数返回到Java,引用将获得GC。
该规则的例外情况是,如果您创建了很多这些规则,可能是在循环中。然后可以填充本地参考表。请参阅IBM: Overview of JNI object references。
您应该阅读JNI Local Reference Changes in ICS。即使您不是为Android编写,它仍然会识别许多常见错误。