主要講解下昨天需要詳細說明有關Java
JNI相關的異常處理、安全執行緒問題,在JNI中產生的異常主要是記憶體不足OutOfMemoryError、數組越界
ArrayIndexOutOfBoundsException、數組賦實值型別錯誤ArrayStoreException以及指標越界等問題。簡單的我
們昨天在 Android JNI開發提高篇
中已經講到。
除了Throw或ThrowNew來拋出異常外,還提供了5個函數來處理,分別為jthrowable
ExceptionOccurred(JNIEnv *env);、void ExceptionDescribe(JNIEnv
*env);、void ExceptionClear(JNIEnv *env); 、 jboolean (JNIEnv *env) 和void
FatalError(JNIEnv *env, const char *msg);
1. ExceptionCheck 用於檢測如果一個異常已經拋出,則該方法將會返回JNI_TRUE就是typedef定義為1的布爾值。
2. ExceptionOccurred 擷取正在拋出一個異常的本地引用,Native或Java層必須處理該異常,並返回一個jthrowable對象。
3. ExceptionDescribe主要用於列印出異常的錯誤描述。
4. ExceptionClear清除剛剛拋出的異常。
5. FatalError 的作用比較特殊,產生一個致命性的錯誤,Android123提示這樣會導致JVM將關閉,就是程式停止運行了,所以使用時要謹慎。
我們以C++的代碼做個例子,簡單的說明下他們的使用方法
env->FindClass("Android123CWJ"); //假設這個類本身不存在<br /> if(env->ExceptionCheck())<br /> {<br /> env->ExceptionDescribe();<br /> env->ExceptionClear();<br /> }
這樣JVM因為尋找Android123CWJ類不存在,導致了一個NoClassDefFoundError的異常。
在JNI中處理資源同步問題,JNI提供了一組函數分別為jint MonitorEnter(JNIEnv *env, jobject
obj); 和 jint MonitorExit(JNIEnv *env, jobject obj);
方法,類似一個簡單的同步鎖,在Java中我們這樣寫
synchronized (obj) {<br /> //dosomething<br />}
在JNI中,我們使用這組函數這樣寫
(*env)->MonitorEnter(obj);<br /> //dosomething<br />(*env)->MonitorExit(obj);
明天Android開發網繼續講解JNI相關的內容,詳細說明下JNI中Java類的構造,尋找以及方法和欄位的訪問等知識,希望有空的網友先瞭解下
Java的反射以及動態代理相關知識這樣可以更好的理解我們的最後一節 Android JNI開發進階篇有關的內容。