min*_*nsk 3 java java-native-interface android-ndk
如果有办法测试任意作业以检测它是本地引用还是全局引用,我找不到答案.我在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;
}
Run Code Online (Sandbox Code Playgroud)
不知道我怎么错过了,但看起来在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
Run Code Online (Sandbox Code Playgroud)
http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html