Android NDK開發篇:Java與原生代碼通訊(異常處理)

來源:互聯網
上載者:User

標籤:occurred   roi   inter   row   遇到   停止   資源   lang   lan   

一、捕獲異常

    異常處理是Java中的功能,在Android中使用SDK進行開發的時候經常要用到。Android原生代碼在執行過程中如果遇到錯誤,需要檢測,並拋出異常給Java層。執行原生代碼出現了問題,例如使用了null 指標、記憶體流失,並且沒有做相應的檢測盒異常拋出,APP會馬上閃退,沒有任何提示。

    JNI中的異常處理和Java的不一樣。Java中的異常處理,是直接捕獲,然後做相應的處理。JNI要求開發人員在異常發生之後顯式實現異常處理流。例如以下例子:

  1. public class JavaClass {  
  2.     /** 
  3.      * 異常拋出方法 
  4.      */  
  5.     private void throwException() throws NullPointerException {  
  6.         throw new NullPointerException("Null pointer");  
  7.     }  
  8.       
  9.     /** 
  10.      * 原生方法 
  11.      */  
  12.     private native void nativeMethod();  
  13. }  

    在原生方法nativeMethod中調用throwException方法,nativeMethod原生方法需要顯示地做異常處理。JNI提供了ExceptionOccurred函數查詢虛擬機器是否有掛起的異常。在使用完之後,還需要ExceptionClear函數顯式地清除異常。

 
  1. jthrowable ex;  
  2.   
  3. //...  
  4.   
  5. (*env)->CallVoidMethod(env, instance, throwExceptionId);  
  6. ex = (*env)->ExceptionOccurred(env);  
  7. if (0 != ex) {  
  8.     (*env)->ExceptionClear(env);  
  9. }  

  二、拋出異常

    JNI也允許原生代碼拋出異常。由於異常是Java的類,所以在JNI中需要用FindClass函數找到異常類,用ThrowNew函數就可以初始化並拋出新的異常。例如:

 
  1. jclass clazz;  
  2.   
  3. //...  
  4.   
  5. clazz = (*env)->FindClass(env, "java/lang/NullPointerException");  
  6. if (0 != clazz) {  
  7.     (*env)->ThrowNew(env, clazz, "Exception message.");  
  8. }  

    因為原生方法不受虛擬機器的控制,所以拋出的異常並不會停止原生方法的執行。在拋出異常的時候,需要釋所有已經分配的資源,例如記憶體資源...通過JNIEnv介面獲得的局部引用,在原生方法返回之後會被虛擬機器自動釋放。

Android NDK開發篇:Java與原生代碼通訊(異常處理)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.