原文出處: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 | 檢查是否存在異常信息 |