2023-01-21 271
要实现从本机代码到Java代码的回调函数,我必须使用NewGloabRef创建一个全局参考.从内存配置文件中,我发现,一旦我打电话给env->NewGlobalRef(weak_this),即使是播放器对象的薄弱引用,播放器对象也将作为根对象可用,我认为这将阻止其被收集到垃圾.
,但我的理解是弱参考不会阻止对物体收集垃圾.
//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
a WeakReference是一个具有普通引用的Java对象.它包含对另一个对象的引用.它是”弱”所包含的引用,而不是对WeakReference本身的引用.
因此,当您调用env->NewGlobalRef(weak_this)(假设weak_this为WeakReference)时,效果与将weak_this分配给静态.它不会导致包含WeakReference包含的对象引用可靠.
我认为您可能正在误解记忆profiler告诉您的内容.特别是,我希望它可以显示A WeakReference的包含参考,直到GC决定打破链接为止.尝试在普通static变量中使用WeakReference的实验.
更新
我开始认为这是JNI NewGlobalRef的正常行为. JNI文档(一如既往)对该方法的行为非常含糊.
请注意,还有一种称为NewGlobalWeakRef的JNI方法;参见 http://java.sun.com/docs/books/books/books/jni/html/refs.html#27531 .如果没有别的,NewGlobalWeakRef提供了做您要做的事情的替代方法.
以上所述是小编给大家介绍的弱引用的NewGlobalRef仍然可以防止对象被垃圾回收,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/26299.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态