Android JNI開發進階篇

來源:互聯網
上載者:User

主要講解下昨天需要詳細說明有關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開發進階篇有關的內容。   

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.