Android ndk 是NewGlobalRef/DeleteGlobalRef调用;递归的;?

Android ndk 是NewGlobalRef/DeleteGlobalRef调用;递归的;?,android-ndk,java-native-interface,Android Ndk,Java Native Interface,这是一个非常基本的问题,但我看不到文档中有任何解释。假设我有一个jobject(或jclass)。我创建了一个全局ref(NewGlobalRef),并将其存储起来供以后使用。然后我创建另一个并再次存储它。然后删除第二个ref,然后删除第一个ref。它会像我预期的那样工作吗?只要NewGlobalRef调用的数量大于此对象的DeleteGlobalRef调用的数量,就确保对象保持活动状态,并且所有未删除的引用都有效?是 每个JNI全局和本地引用都是一个单独的垃圾收集根。根是指在标记和扫掠过程中被

这是一个非常基本的问题,但我看不到文档中有任何解释。假设我有一个
jobject
(或
jclass
)。我创建了一个全局ref(
NewGlobalRef
),并将其存储起来供以后使用。然后我创建另一个并再次存储它。然后删除第二个ref,然后删除第一个ref。它会像我预期的那样工作吗?只要
NewGlobalRef
调用的数量大于此对象的
DeleteGlobalRef
调用的数量,就确保对象保持活动状态,并且所有未删除的引用都有效?

每个JNI全局和本地引用都是一个单独的垃圾收集根。根是指在标记和扫掠过程中被视为活动的第一个对象。单个对象可以有任意数量的JNI引用

当然,对象可以引用其他对象,所以删除对对象的所有JNI引用并不意味着它不再活动

至于“递归”,我以为你指的是别的。JNI引用只引用堆对象,而不是堆对象本身。因此,不涉及递归


请在IBM继续阅读。

谢谢。我把它称为递归,作为递归互斥的类比,因为没有更好的词。我意识到
DeleteGlobalRef
可能不会导致立即删除对象,这很好。我的问题是全局引用由于未知的原因而变得无效,所以我决定找出它们是否应该按我预期的方式工作。IBM的知识中心有很多有用的文章。让我将链接修复到正确的链接-