JNI Throw нарушает выполнение метода? - PullRequest
4 голосов
/ 13 октября 2019

Когда я вызываю 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 вызван?

Ответы [ 2 ]

5 голосов
/ 13 октября 2019

Исключение JNI не сразу прерывает выполнение собственного метода . Но если вы не обработаете это исключение правильно, любой вызов функции JNI (кроме тех немногих, которые явно очищены) завершится сбоем.

2 голосов
/ 13 октября 2019

Что произойдет, когда я вызову метод load_main_class, он не может найти класс и вызван метод ThrowNew?

В вашем конкретном случаеNoClassDefFoundError, ожидающий сразу после env->FindClass(name) возвращенного NULL, будет перезаписан исключением env->ThrowNew(env->FindClass("java/lang/NoClassDefFoundError"), message), выдаваемым рукой, которое будет сгенерировано при возврате элемента управления обратно в код Java.

То, что вы описалинеправильный способ обработки исключений в коде JNI. Вы должны были проверить его с помощью env->ExceptionOccurred();, а затем вызвать env->ExceptionClear(), чтобы указать, что исключение было обработано.

...