23 JNI - JNI异常处理

161 阅读1分钟

Android Ndk 学习笔记(目录)

// 异常
    public native void exception1();

    public native void exception2() throws NoSuchFieldException;

    public native void exception3();
 exception1(); // C++层自己做了补救措施了

        // 捕获人家C++层抛上来的异常
        try {
            exception2();
        } catch (NoSuchFieldException exception) {
            exception.printStackTrace();
            Log.d("Derry", "exceptionAction: 异常被我捕获了");
        }

        exception3();
extern "C"
JNIEXPORT void JNICALL
Java_com_cn_mynativestudy_MainActivity2_exception1(JNIEnv *env, jobject thiz) {

    jclass j_class = env->GetObjectClass(thiz);

    jfieldID f_id = env->GetFieldID(j_class,"named", "Ljava/lang/String;");


    jthrowable thr = env->ExceptionOccurred();

    if(thr){

        LOGI("C++ 有异常 ,监测到了 ");

        env->ExceptionClear();

        jfieldID f_id = env->GetFieldID(j_class,"name", "Ljava/lang/String;");

    }


}
extern "C"
JNIEXPORT void JNICALL
Java_com_cn_mynativestudy_MainActivity2_exception2(JNIEnv *env, jobject thiz) {
    jclass j_class = env->GetObjectClass(thiz);

    jfieldID f_id = env->GetFieldID(j_class,"named", "Ljava/lang/String;");

    jthrowable thr = env->ExceptionOccurred();

    jthrowable jthrowable = env->ExceptionOccurred(); // 监测本次执行,到底有没有异常   JNI函数里面代码有问题

    if(jthrowable) { // 非0 进去,监测到有异常
        LOGD("C++层有异常 监测到了");

        env->ExceptionClear(); // 此异常被清除

        // Throw抛一个 Java的对象     java/lang/String    java/xxxxx/xxx/NullExxx
        jclass clz = env->FindClass("java/lang/NoSuchFieldException");
        env->ThrowNew(clz, "NoSuchFieldException 是在是找不到 name8888啊,没有办法,抛给你了");
    }

}
extern "C"
JNIEXPORT void JNICALL
Java_com_cn_mynativestudy_MainActivity2_exception3(JNIEnv *env, jobject thiz) {
    jclass j_class = env->GetObjectClass(thiz);

    jmethodID showID = env->GetStaticMethodID(j_class, "show", "()V");
    env->CallStaticVoidMethod(j_class, showID); // 是不是这句话奔溃的   1是   2不是   答:不是,只是他引起的而已

    // ExceptionCheck 《==》 慢慢的奔溃的,相当于给了你空余时间,既然不是马上奔溃,我就可以检测

    // JNI函数里面代码有问题 没有问题,给你空余时间,慢慢的奔溃的
    if (env->ExceptionCheck()) {
        env->ExceptionDescribe(); // 输出描述 信息
        env->ExceptionClear(); // 此异常被清除    业务逻辑控制
    }
}