1.前言
为了更好的处理JNI下异常,防止崩溃,下面介绍下JNI层的异常处理函数,并通过相关实例方便理解使用场景。基本操作和Android一样分为:检查异常,抛出异常,捕获异常,处理异常。
2.JNI异常函数
2.1ThrowNew
抛出异常
jclass newExcCls = env->FindClass("java/lang/IllegalArgumentException");
env->ThrowNew(newExcCls, "throw from JNI");
2.2ExceptionOccured
获取一个正发生异常的引用
jthrowable jthrowable1 = env->ExceptionOccurred();
2.3ExceptionClear
清除异常,则Java层不会打印异常的堆栈信息
env->ExceptionClear();
2.4FatalError
抛出致命错误
const char* c = env->GetStringUTFChars(jstring1, 0);
env->FatalError(c)
2.5ExceptionCheck
检查是否出现异常
if (env->ExceptionCheck()){
return;
}
2.6ExceptionDescribe
如果出现异常打印异常信息
env->ExceptionDescribe();
3.JNI实例演示
JNIEXPORT void JNICALL Java_jni_chowen_com_nativeapp_MainActivity_throwException
(JNIEnv *env, jobject jobject1, jstring jstring1) {
jclass jclass1 = env->FindClass("java/io/IOException");
const char* c = env->GetStringUTFChars(jstring1, 0);
env->FatalError(c); // 抛出一个致命异常
jthrowable jthrowable1 = env->ExceptionOccurred();
if (env->ThrowNew(jclass1, c) == JNI_OK){
if(jthrowable1){
env->ExceptionDescribe();
env->ExceptionClear();
LOGE("JNI throw suc ExceptionOccurred");
}
LOGE("JNI throw suc");
} else {
LOGE("JNI throw failed");
}
}
网友评论