原文出處:http://www.ccbu.cc/index.php/android/android-jni-thread-exception.html
線程操作
JNIEnv指針僅在創(chuàng)建它的線程有效。C/C++創(chuàng)建的線程默認是沒有附加到JVM的肋坚,如果我們需要在本地線程線程訪問JVM排吴,那么必須先調(diào)用AttachCurrentThread
將當前線程與JVM進行關(guān)聯(lián)众眨,然后才能獲得JNIEnv對象。線程退出或不再需要使用JNIEnv時阻逮,我們必須通過調(diào)用DetachCurrentThread
來解除連接粱快,否則可能會導致線程不能正常退出或程序奔潰等問題。
函數(shù) | 說明 |
---|---|
AttachCurrentThread | 將當前線程附件到JVM |
DetachCurrentThread | 解除當前線程與JVM的連接 |
Java中訪問native方法并沒有線程限制,所以我們的本地代碼并不一定只會運行在main線程中 事哭,同時本地C/C++也可用創(chuàng)建子線程漫雷,在多線程的情況下,就不得不考慮 線程同步問題了慷蠕。 Java中珊拼,JDK為我們提供了synchronized來處理多線程同步代碼塊 ,相應的在JNI中也提供了兩個函數(shù)來完成線程同步流炕。
函數(shù) | 說明 |
---|---|
MonitorEnter | 進入臨界區(qū) |
MonitorExit | 退出臨界區(qū) |
異常處理
C++中可以使用其內(nèi)部的異常機制澎现,但是這套機制拋出的異常并不會傳遞給我們的JVM,所以為了你補這個缺點每辟,JNI實現(xiàn)了一套可以和JVM進行交流的異常機制 剑辫。
函數(shù) | 說明 |
---|---|
Throw | 拋出已有的異常對象 |
ThrowNew | 拋出一個新異常對象 |
ExceptionOccurred | 獲取JVM拋出的異常 |
ExceptionDescribe | 輸出錯誤日志 |
ExceptionClear | 清空異常信息 |
FatalError | 產(chǎn)生一個嚴重的錯誤 |
ExceptionCheck | 檢查是否存在異常信息 |