五.處理本機代碼中的異常
為了處理以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);