java - 在 java 原生接口(interface)中调用 DeleteLocalRef

标签 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,或者垃圾收集器是否会清理内存?

最佳答案

不,不会,但是您的代码可以在早于 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/

相关文章:

android - 约束到底部但允许键盘覆盖 View

java - 强制 JNI Get<type>ArrayElements 返回指针

java - 从 Java 调用 C++ 函数。映射 "const char*"

c++ - 使用 JNI 调用 API 创建 java7 JVM

java - 将 openCV 与 jsp 一起使用会导致 UnsatisfiedLinkError?

java - 使用 Parse.com 从数据库获取数据以显示在 ListView 中

java - textinputlayout 密码切换图标被阻止

java - 允许最终字段采用默认值

java - 需要修复错误 - javax.crypto.BadPaddingException : Given final block not properly padded

java - 如何在每行添加3个按钮