編輯:關於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);
File file = new File(“hah.txt”);//只是創建了一個對象file, file指向了hah.txt這個文件,hah.t
activity的啟動模式一共有四種:standard、singleTop、singleTask和singleInstance,可以在AndroidMannifest.x
通過本次小Demo我學到了:1、ListView的小小的一個分頁功能2、加深了對自定義控件的理解3、對ListView的優化4、對BaseAdapter的使用5、自定義A
在用微信的時候,發現微信建立了自己的獨立賬戶管理,同時在聯系人中,可以直接點擊發送信息,查看朋友圈等功能,感覺挺方便了 然後就做了相關方面的調研,主要從兩個方面,進行了研