有没有一种方法可以检查jobject是本地引用还是全局引用?

4

我找不到一个方法来测试任意jobject对象以检测它是局部引用还是全局引用。在JNI文档中没有看到相关内容。

这个问题的原因是为了增加一些错误检查和逻辑,以适应我的自定义JNI工具。在我的代码中,jobject引用可能来自不同的地方(包括其他用户/模块),因此我正在寻找一种测试它的方法。

例如,我想要一个实用程序将局部引用“提升”为全局引用,但它也应该适用于全局引用(即如果传递了全局引用,则不应崩溃或出现任何问题)。我可以尝试异常检查,但我不知道如何避免误报。

如果对全局引用调用DeleteLocalRef会发生什么。文档说NewGlobalRef可以传递全局或局部引用,但我认为删除错误引用会有问题。

jobject toGlobalRef(jobject& locRef)
{
    JNIEnv* env = jniEnv();  //gets correct JNIEnv* here

    if (locRef == NULL)
        return NULL;

    jobject globalRef = env->NewGlobalRef(locRef);
    env->DeleteLocalRef(locRef);
    locRef = NULL; 
    return globalRef;        
}
1个回答

7

我不知道为什么错过了,但JNI 1.6中似乎添加了一个函数来检查引用类型:

jobjectRefType GetObjectRefType(JNIEnv* env, jobject obj);

The function GetObjectRefType returns one of the following enumerated values defined as a jobjectRefType:

JNIInvalidRefType = 0,
JNILocalRefType = 1,
JNIGlobalRefType = 2,
JNIWeakGlobalRefType = 3

http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html


2
如果需要在 Android 4.0 之前的版本中运行,请参见 http://developer.android.com/training/articles/perf-jni.html#unsupported 中的说明。 - fadden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接