為了處理以Java代碼實現的方法執(zhí)行中拋出的異常,或者是Native代碼中拋出的Java異常阅爽,JNI提供了Java異常機制的鉤子程序路幸。該機制與C/C++中常規(guī)函數實現的標準錯誤處理無關。JNI提供一個函數集來在本機代碼中檢查付翁、分析和處理Java異常简肴。用JNIEnv實例來調用
-
jboolean ExceptionCheck();
如果一個異常已經拋出,下面的函數返回JNI_TRUE百侧,否則返回JNI_FALSE:
/*如:當異常發(fā)生時砰识,清理并拋出自定義異常*/
if(env->ExceptionCheck())
{
env->ExceptionClear();//清除異常
env->ThrowNew(env->FindClass("java/lang/Exception"),"JNI捕捉了異常");
}
-
void ExceptionDescribe()
函數獲取正在被拋出異常的一個本地引用。本機代碼或者Java代碼必須處理該異常移层。 -
void ExceptionDescribe()
函數打印有關剛剛被拋出到標準錯誤輸出中的異常信息。該信息包括一個棧追蹤信息赫粥。 -
void ExceptionClear()观话;
函數清理一個剛剛拋出的異常。
*jint Throw(jthrowable obj)
函數拋出一個已經創(chuàng)建的異常越平。如果異常成功拋出剃毒,返回0暴备;否則返回一個負值。
/*可以這樣使用:手動拋出異常,然后在本機或Java代碼中處理*/
jthrowable mException = NULL;
mException = env->ExceptionOccurred();
if (mException != NULL) {
env->Throw(mException);
//或拋出自定義異常
env->ThrowNew(env->FindClass("java/lang/Exception"), "xxx異常");
//最后別忘了清除異常判莉,不然還是會導致VM崩潰
env->ExceptionClear();
}
-
jint ThrowNew(jclass clazz, const char* message)
函數基于clazz創(chuàng)建一個異常,它應該是繼承自Throwable衷咽,并且異常文本是由msg(按照UTF-8)指定悬嗓。如果異常的構造以及拋出成功,返回0避咆;否則返回一個負值舟肉。