JNI异常处理

作者: 码上述Andy | 来源:发表于2019-07-05 00:14 被阅读10次

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");
    }
}

相关文章

网友评论

    本文标题:JNI异常处理

    本文链接:https://www.haomeiwen.com/subject/eprfcctx.html