23 JNI - JNI异常处理

这篇博客详细介绍了在Android NDK中如何处理异常,包括监测和捕获C++层的异常,并展示了Java与C++之间的异常交互。通过示例代码解释了`ExceptionOccurred`、`ExceptionClear`和`ThrowNew`等关键函数的使用,以及如何在JNI层进行异常检查和处理。

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(); // 此异常被清除    业务逻辑控制
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值