如何解决弱引用的NewGlobalRef仍然可以防止对象被垃圾收集
| 要实现从本机代码到Java代码的回调函数,我必须使用NewGloabRef
创建全局引用。从内存配置文件中,我发现,一旦我叫“ 1”,即使它是播放器对象的弱引用,该播放器对象也将可用作“根对象”,我认为这将防止它被垃圾回收。
但是我的理解是,弱引用不会阻止对象被垃圾收集。
//java code
Player{
native_init(new WeakReference(this)),}
//JNi code
//listener
Listener::Listener(jobject weak_this)
{
//will use mObject for callback
mObject = env->NewGlobalRef(weak_this);
}
xxxx_Player_native_init(xxxx. Object weak_this)
{
Listener l = new Listener(weak_this);
}
编辑:
内存配置文件:
Root Object 0x2C820E10 <com/trident/tv/media/player/JniTPlayer>
com/trident/tv/media/player/JniTPlayer.trace : 0x2C83CC54 <java/lang/String>
com/trident/tv/media/player/JniTPlayer.listenerList : 0x2C820E64 <java/util/Vector>
JNI的日志
[JNI] NewGlobalRef(0x2C820E10 [com/trident/tv/media/player/JniTPlayer]) : 0x2C820E10
解决方法
ѭ5是具有普通引用的Java对象。它包含对另一个对象的引用。所包含的引用为“弱”,而不是对“ 5”本身的引用。
因此,当您调用
env->NewGlobalRef(weak_this)
(假设weak_this
是WeakReference
)时,其效果与将static8ѭ分配给静态对象的效果相同。不会导致ѭ5所包含的对象引用很容易到达。
我认为您可能会误解内存分析器告诉您的内容。特别是,我希望它能显示出包含的ѭ5引用,直到GC决定断开链接为止。尝试在普通的static
变量中使用ѭ5进行实验。
更新
我开始认为这是JNINewGlobalRef
的正常行为。 JNI文档(一如既往)对方法的行为非常含糊。
注意,还有一个名为NewGlobalWeakRef
的JNI方法。请参阅http://java.sun.com/docs/books/jni/html/refs.html#27531。否则,NewGlobalWeakRef
将提供您尝试做的另一种方式。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。