我从 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,或者垃圾收集器是否会清理内存?
最佳答案
不,不会,但是您的代码可以在早于 ICS 的 Android 版本上运行。在 ICS 中,此代码将正确地失败。
一般来说,您不需要自己删除本地引用,一旦 JNI 函数返回到 Java,引用就会被 GC 处理。
该规则的异常(exception)情况是,如果您创建了很多,也许是在一个循环中。然后就可以填充本地引用表了。参见 IBM: Overview of JNI object references .
你应该阅读 JNI Local Reference Changes in ICS .即使您不是为 Android 编写,它仍然会识别出许多常见错误。
关于java - 在 java 原生接口(interface)中调用 DeleteLocalRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16619445/