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,const char *msg);

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



 

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

void FatalError(const char *msg);




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM