Android NDK之JNI異常處理
阿新 • • 發佈:2019-02-12
處理本機程式碼中的異常
為了處理以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);