Android JNI開發摘錄(四)之JNI異常處理

五.處理本機代碼中的異常

    爲了處理以Java代碼實現的方法執行中拋出的異常,或者是以本機代碼編寫的方法拋出的Java異常,JNI提供了Java異常機制的鉤子程序。該機制與C/C++中常規函數實現的標準錯誤處理無關。JNI提供一個函數集來在本機代碼中檢查、分析和處理Java異常。

   (1).如果一個異常已經拋出,下面的函數返回JNI_TRUE,否則返回JNI_FALSE:


jboolean ExceptionCheck();

/*如:當異常發生時,清理並拋出自定義異常*/
if(env->ExceptionCheck())
{
  env->ExceptionClear();//清除異常
  env->ThrowNew(env->FindClass("java/lang/Exception"),"xx異常");
}



   (2).ExceptionOccurred函數獲取正在被拋出異常的一個本地引用。本機代碼或者Java代碼必須處理該異常:

jthrowable ExceptionOccurred();


   (3).ExceptionDescribe函數打印有關剛剛被拋出到標準錯誤輸出中的異常信息。該信息包括一個棧追蹤信息:

void ExceptionDescribe();


   (4).ExceptionClear函數清理一個剛剛拋出的異常:

void ExceptionClear();


   (5).Throw 函數拋出一個已經創建的異常。如果異常成功拋出,返回0;否則返回一個負值:

jint Throw(jthrowable obj);

/*可以這樣使用:手動拋出異常,然後在本機或Java代碼中處理*/
jthrowable mException = NULL;
mException = env->ExceptionOccurred();
if (mException != NULL) {
       env->Throw(mException);
/*或拋出自定義異常
       env->ThrowNew(env->FindClass("java/lang/Exception"),
               "xxx異常"); */
//最後別忘了清除異常,不然還是會導致VM崩潰
       env->ExceptionClear();
return -1;
   }



   (6).ThrowNew函數基於clazz創建一個異常,它應該是繼承自Throwable,並且異常文本是由msg(按照UTF-8)指定。如果異常的構造以及拋出成功,返回0;否則返回一個負值。

jint ThrowNew(jclass clazz,constchar *msg);

/*如:在可能出錯的地方拋出自定義異常,然後在本機代碼或者Java代碼中處理*/
env->ThrowNew(env->FindClass("java/lang/Exception"),
               "xxx異常");




    (7)FatalError函數會生成致命錯誤信號。一個致命錯誤是特指無法恢復的情況。VM在調用該函數之後將會關閉:

void FatalError(constchar *msg);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章