首页 > 解决方案 > JNI Throw 是否会中断方法执行?

问题描述

当我调用时env->ThrowNew(clazz, "..."),C++/C方法的后续执行会停止还是我必须自己停止?

// This is the method which checks if a class can be loaded.

static inline jclass _check_find_class(JNIEnv* env, char* name) {
    jclass clazz = env->FindClass(name);

    if (clazz == NULL) {
        env->ThrowNew(env->FindClass("java/lang/NoClassDefFoundError"), message);
    }

    return clazz;
}

// This method is called in other functions like

jclass load_main_class(JNIEnv* env) {
    auto clazz = _check_find_class(env, "class/which/cannot/be/loaded");

    do_stuff(env, clazz);

    return clazz;
}

当我调用load_main_class方法时会发生什么,它无法找到类并且ThrowNew调用了方法?

标签: javac++java-native-interface

解决方案


JNI 异常不会立即中断本机方法的执行。但是如果你没有正确处理这个异常,那么任何 JNI 函数调用(除了极少数被显式清除的函数调用)都会崩溃。


推荐阅读