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,constchar *msg);
/*如:在可能出錯的地方拋出自定義異常,然后在本機代碼或者Java代碼中處理*/
env->ThrowNew(env->FindClass("java/lang/Exception"),
? ? ? ? ? ? ? ?"xxx異常");
? ? (7)FatalError函數會生成致命錯誤信號。一個致命錯誤是特指無法恢復的情況。VM在調用該函數之后將會關閉:
void FatalError(constchar *msg);
轉載于:https://blog.51cto.com/huihui88/1399266
總結
以上是生活随笔為你收集整理的Android JNI开发摘录(四)之JNI异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【UIKit】TabView
- 下一篇: jquery 导航栏目