Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android NDK學習筆記13-JNI的局部和全局引用

Android NDK學習筆記13-JNI的局部和全局引用

編輯:關於Android編程

局部引用

大多數JNI函數返回局部引用。局部引用不能在後續的調用中被緩存及重用,主要是因為它們的使用期限僅限於原生方法,一旦原生函數返回,局部引用即被釋放。例如,使用FindClass函數返回一個局部引用,當原生方法返回時,它被自動釋放,也可以用DeleteLocalRef函數顯示釋放原生代碼:

jclass clazz
clazz = (*env)->FindClass(env,"java/lang/String");
……
(*env)->DeleteLocalRef(env,clazz);

根據JNI的規范,虛擬機應該允許原生代碼創建最少16個局部引用。

全局引用

全局引用在原生方法的後續調用過程中依然有效,除非它們被原生代碼顯示釋放。
1.創建全局引用
可以用NewGlobalRef函數將局部引用初始化為全局引用,例如:

jclass localclazz
jclass globalclazz
……
localclazz = (*env)->FindClass(env,"java/lang/String");
globalclazz = (*env)->NewGlobalRef(env,localclazz );
……
 (*env)->DeleteLocalRef(env,localclazz );

2.刪除全局引用
當原生代碼不再需要一個全局引用時,可以隨時用DeleteLocalRef函數釋放它。

 (*env)->DeleteLocalRef(env,globalclazz );

弱全局引用

弱全局引用和全局引用一樣,在原生方法的後續調用過程中依然有效。與全局引用不同,弱全局引用並不阻止潛在的對象被垃圾回收。
1.創建弱全局引用
用NewWeakGlobalRef函數對弱全局引用進行初始化,例如:

jclass weakGlobalclazz
weakGlobalclazz = (*env)->NewWeakGlobalRef(env,localclazz);

2.弱全局引用的有效性校驗
可以使用IsSameObject函數檢驗一個弱全局引用是否仍然指向活動的類實例,例如:

if(JNI_FALSE == (*env)->IsSameObject(env,weakGlobalClazz,NULL)){
/*對象仍然處於活動狀態且可以使用*/
}else{
/*對象被垃圾回收期收回,不能使用*/
}

刪除弱全局引用

可以隨時使用DeleteWeakGlobalRef函數釋放弱全局引用。

(*env)->DeleteLocalRef(env,weakGlobalClazz);
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved