JNI返回Java对象,可以返回本地参考,还是必须是全局

JNI returning Java object, is it OK to return local reference, or must it be global?

本文关键字:返回 全局 参考 对象 Java JNI      更新时间:2023-10-16

在jni方法中说我要返回java字符串(或任何其他Java对象(。返回的对象是该方法中创建的本地参考,还是应转换返回值全球参考?

琐碎的示例:

extern "C"
JNIEXPORT jstring JNICALL Java_some_package_SomeObj_getStringTest(JNIEnv *env, jclass obj)
{
    return env->NewString("Test", 4); // OK to return local reference?
}

或应该是:

extern "C"
JNIEXPORT jstring JNICALL Java_some_package_SomeObj_getStringTest(JNIEnv *env, jclass obj)
{
    jstring str = env->NewString("Test", 4);
    return env->NewGlobalRef(str); // Must return a global reference?
}

来自JNI文档

全球和本地参考

JNI将本机代码使用的对象引用分为两个类别: local 全局参考。本地参考对于本机方法调用的持续时间有效,并且在本机方法返回后自动释放。全球参考文献在明确释放之前一直有效。

对象作为本地参考传递给本机方法。 JNI函数返回的所有Java对象都是本地参考。JNI允许程序员从本地参考创建全局引用。期望Java对象的JNI功能同时接受全局和局部参考。本机方法可以返回本地或全局引用VM的结果。

所以,您的第一个示例完全很好且合法:

extern "C"
JNIEXPORT jstring JNICALL Java_some_package_SomeObj_getStringTest(JNIEnv *env, jclass obj)
{
    return env->NewString("Test", 4); // OK to return local reference?
}

前者,我已经做到了。按预期工作。