Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android NDK學習筆記14-JNI的線程

Android NDK學習筆記14-JNI的線程

編輯:關於Android編程

JNI技術的一些約束:

1.只在原生方法執行期間及正在執行原生方法的線程環境下局部引用時有效的,局部引用不能在多線程間共享,只有全局引用可以被多個線程共享。

2.被傳遞給每個原生放的的JNIEnv接口指針在與方法調用相關的線程中也是有效的,它不能被其他線程緩存或使用。

同步

JNI的監視器允許原生代碼利用Java對象同步,虛擬機保證存取監視器的線程能夠安全執行,而其他線程等待監視器對象編程可用狀態,例如:

synchronized(obj){
/*同步線程安全代碼塊*/
}

在原生代碼中相同級別同步可以用JNI的監視器方法實現的,例如:

if(JNI_OK == (*env)->MonitorEnter(env,obj)){
/*錯誤處理*/
}
/*同步線程安全代碼塊*/
if(JNI_OK == (*env)->MonitorExit(env,obj)){
/*錯誤處理*/
}

原生線程

為了執行特定任務,這些原生構件可以並行使用原生線程。為了與應用的依然活躍部分交互,衍生線程應該先附著在虛擬機上。

JNI通過JavaVM接口指針提供了AttachCurrentThread函數以便讓原生代碼將原生線程附著到虛擬機上,例如:

JavaVm* cachedJvm;
……
JNIEnv* env;
……
/*將當前線程附著到虛擬機上*/
(*cachedJvm)->AttachCurrentThread(cachedJvm,&env,NULL);

/*可以用JNIEnv接口實現線程與java應用程序的通信*/

/*將當前線程與虛擬機分離*/
(*cachedJvm)->DetachCurrentThread(cachedJvm);

對AttachCurrentThread函數的調用允許應用程序獲得對當前線程有效的JNIEnv接口指針。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved