局部和全局引用的操作
? ? 引用在Java編程中起到重要作用。這個虛擬機通過跟蹤他們的引用來管理類實例的生命周期和垃圾管理機制收集不被引用的。因為本地代碼不是一個管理的環境,這JNI提供了一套函數來運行本地的代碼,明確的管理類的引用和生命周期。這JNI支持三張類型的引用:局部引用,全局引用和弱引用。
? ? 局部引用
? ?局部引用不能被緩存和重復使用在一系列的調用因為他們的生命周期被限制在本地的方法。本地引用被釋放一旦本地的方法返回。例如,這個FindClass函數返回一個弱引用;當本地方法返回時,自動釋放掉。也可以明確的釋放通過DelteLocalRef函數來釋放。
??jclass clazz;
? clazz = (*env)->FindClass(env, "java/lang/String");
? 新建全局引用
? ? 全局引用通過NewGLobalRef函數用本地引用來初始化。
? ?jclass localClazz;
? ?jclass globalClazz;
? ...
? localClazz = (*env)->FindClass(env, "java/lang/String");
? globalClazz = (*env)->NewGlobalRef(env, localClazz);
? ...
? (*env)->DeleteLocalRef(env, localClazz);
刪除全局引用
? 當全局引用不在需要時,調用DeleteGlobalRef刪除全局引用。
?(*env)->DeleteGlobalRef(env, globalClazz);
?弱全局引用
像全局引用一樣,接下來的本地方法的調用仍舊是有效的。不像全局引用那些,弱全局引用強調的對象(underlying object)可以被回收。
? ?新建弱全局引用
??jclass weakGlobalClazz;
? weakGlobalClazz = (*env)->NewWeakGlobalRef(env, localClazz);
? 驗證一個弱全局引用
?決定是否這個弱引用正在指向一個存活類的實例,你能夠使用IsSameObject函數。
? if (JNI_FALSE == (*env)->IsSameObject(env, weakGlobalClazz, NULL)) {
? /* Object is still live and can be used. */
? } else {
? /* Object is garbage collected and cannot be used. */
? }
刪除弱引用
(*env)->DeleteWeakGlobalRef(env, weakGlobalClazz);
總結
以上是生活随笔為你收集整理的局部和全局引用的操作的全部內容,希望文章能夠幫你解決所遇到的問題。