Android JNI開發詳解(7)-線程操作,異常處理

原文出處:http://www.ccbu.cc/index.php/android/android-jni-thread-exception.html

線程操作

JNIEnv指針僅在創建它的線程有效。C/C++創建的線程默認是沒有附加到JVM的,如果我們需要在本地線程線程訪問JVM,那麼必須先調用AttachCurrentThread將當前線程與JVM進行關聯,然後才能獲得JNIEnv對象。線程退出或不再需要使用JNIEnv時,我們必須通過調用DetachCurrentThread來解除連接,否則可能會導致線程不能正常退出或程序奔潰等問題。

函數 說明
AttachCurrentThread 將當前線程附件到JVM
DetachCurrentThread 解除當前線程與JVM的連接

Java中訪問native方法並沒有線程限制,所以我們的本地代碼並不一定只會運行在main線程中 ,同時本地C/C++也可用創建子線程,在多線程的情況下,就不得不考慮 線程同步問題了。 Java中,JDK爲我們提供了synchronized來處理多線程同步代碼塊 ,相應的在JNI中也提供了兩個函數來完成線程同步。

函數 說明
MonitorEnter 進入臨界區
MonitorExit 退出臨界區

異常處理

C++中可以使用其內部的異常機制,但是這套機制拋出的異常並不會傳遞給我們的JVM,所以爲了你補這個缺點,JNI實現了一套可以和JVM進行交流的異常機制 。

函數 說明
Throw 拋出已有的異常對象
ThrowNew 拋出一個新異常對象
ExceptionOccurred 獲取JVM拋出的異常
ExceptionDescribe 輸出錯誤日誌
ExceptionClear 清空異常信息
FatalError 產生一個嚴重的錯誤
ExceptionCheck 檢查是否存在異常信息
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章