一个非常基本的问题,但我没有在文档中的任何地方看到它的解释。假设我有jobject
(或jclass
)。我创建了一个全局引用(NewGlobalRef
)并将其存储以供以后使用。然后我创建另一个并再次存储它。然后我删除第二个参考,然后删除第一个参考。它是否会像我预期的那样工作 - 确保对象保持活动状态,只要NewGlobalRef
次调用的次数大于此对象的DeleteGlobalRef
次调用次数,所有未删除的引用都有效?
答案 0 :(得分:1)
是。
每个JNI全局和本地引用都是单个垃圾收集根。根指的是在标记和扫描期间被认为存活的第一个对象。单个对象可以有任意数量的JNI引用。
当然,对象可以引用其他对象,因此只是因为删除对象的所有JNI引用并不意味着它不再存在。
至于“递归”,我认为你的意思是别的。 JNI仅引用引用堆对象,而不是堆对象本身。所以,没有涉及递归。
进一步阅读IBM的Overview of JNI object references。