要實現從本機代碼到Java代碼的回調函數,我必須使用NewGloabRef
創建全局引用。從內存配置文件中,我發現一旦我調用env->NewGlobalRef(weak_this)
,即使它是播放器對象的弱引用,Player對象也將作爲根對象提供,我認爲這會阻止它被垃圾收集。弱引用的NewGlobalRef仍然阻止垃圾收集對象
但我的理解是弱引用不會阻止垃圾收集對象。
//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
Stephen,我在這裏添加了內存配置文件和JNI日誌。一旦我調用'NewGlobalRef','JniTPlayer'出現在根對象部分。而且,我在轉儲出內存配置文件之前強制GC。 – pierrotlefou 2011-05-31 09:58:59
Stephen,NewGlobalWeakRef作品!謝謝! – pierrotlefou 2011-06-01 02:50:33