8

我正在从 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 或者垃圾收集器是否会清理内存?

4

1 回答 1

19

不,它不会,但是您的代码将在 ICS 之前的 Android 版本上运行。从此代码上的 ICS 将正确地失败。

一般来说,您不需要自己删除本地引用,一旦 JNI 函数返回 Java,引用就会被 GC'd。

该规则的例外是如果您创建了很多,可能是在一个循环中。然后可以填写本地参考表。请参阅IBM:JNI 对象引用概述

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

于 2013-06-06T16:49:11.277 回答