java - 有没有办法检查 jobject 是本地引用还是全局引用?

标签 java android-ndk java-native-interface

如果有一种方法可以测试任意作业以检测它是本地引用还是全局引用,我找不到答案。我没有在 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;        
}

最佳答案

不知道我怎么漏掉了,但看起来 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

关于java - 有没有办法检查 jobject 是本地引用还是全局引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18808347/

相关文章:

java - 使用 Flowable 在 Spring 应用程序中进行集成测试

Linux Pam 创建静态库而不是共享库

android - CMake : FIND_PACKAGE(Threads) for Android cross-compilation

android更新项目——路径 "command not found"

java - JNI 方法 : formal argument lists differ in length

java - JPA 分离实体传递到持久化

java - 与 Math.random() 和 ArrayList.remove() 相关的逻辑

java - 应用视频效果

android - 没有找到 JNI_OnLoad ... 跳过 init

android - 使用 Fluidsynth 在 Android 上播放来自 SoundFonts 的音符