我的Java
代码中有一个返回类A对象的方法,该对象通过JNI
调用传递给本机函数,并且在Java
代码中不再使用。但它将在C++
方面长期使用。
我是否应该关注垃圾收集器销毁我的对象,因为它不再出现在Java
那边?
答案 0 :(得分:6)
JNI将本机代码使用的对象引用分为两类:本地引用和全局引用。本地引用在本机方法调用的持续时间内有效,并在本机方法返回后自动释放。全局引用在显式释放之前仍然有效。
因此,您的问题的答案取决于您在C ++代码中的本地引用或全局引用。
将对象作为本地引用传递给本机方法。 JNI函数返回的所有Java对象都是本地引用。 JNI允许程序员从本地引用创建全局引用。
这基本上意味着除非你明确地将任何引用转换为全局引用(使用NewGlobalRef
),否则它们只会被引用"只要JNI呼叫需要。因此,如果代码返回并且没有Java代码引用该对象,那么它可以被垃圾收集。