1. 程式人生 > >Android NDK之JNI異常處理

Android NDK之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);