多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
弱全局引用是Java 2 SDK Release 1.2才引入的,它使用NewGlobalWeakRef创建并使用DeleteGlobalWeakRef销毁。就像全局引用那样,弱全局引用可以跨线程,跨多个函数被调用,但是与全局引用不同的是,弱全局引用不会阻止它指向的对象被资源回收。 弱全局引用在Native代码需要使用某个引用而不需要阻止它指向的对象被资源回收时很有用。如下例子,一个Native方法mypk.MyCls.f需要保存一个指向类mypkg.MyCls2.的引用,在弱全局引用中缓存这个类允许mypkg.MyCls2被卸载。 ~~~ JNIEXPORT void JNICALL Java_mypkg_MyCls_f(JNIEnv *env, jobject self){ static jclass myCls2 = NULL; if(!myCls2){ jclass myCls2Local = (*env)->FindClass(env, "mypkg/myCls2"); if(!myCls2Local) { return; /* can not find class */ } myCls2 = NewWeakGlobalRef(env, myCls2Local); if(!myCls2){ return; /* out of memory */ } } /* ... use myCls2) */ } ~~~ 我们假设MyCls和MyCls2拥有相同的生命周期(例如,他们是同一个类加载器加载的),这样我们不需要考虑MyCls2被卸载了之后又被重新加载而在这个过程中MyCls却仍然被使用。但是,如果这种情况发生了,我们就不得不检查我们所缓存的弱全局引用是否指向一个有效的的对象(这个对象是否已经被回收)。下一节我们将解释如何在弱全局引用上做这样的检测。