Я пытаюсь поймать ошибку в собственном C++-коде на Android. Согласно документам FindClass возвращает NULL, если имя класса не может быть найдено. Но я получил FATAL EXCEPTION: main java.lang.NoClassDefFoundError: fake/class
, и исполнение никогда не доходит до утверждения if.Исключить в Android NDK C++ код
#include <string.h>
#include <jni.h>
extern "C"
void Java_com_example_MainActivity_testError(JNIEnv *env, jobject) {
jclass clazz = env->FindClass("fake/class");
// never gets here
if (clazz == NULL) {
return;
}
}
Также это исключение пропускает блок try-catch и приводит к сбою приложения. Мой код Java:
static {
System.loadLibrary("native-lib");
}
public native void testError();
...
try {
testError();
} catch (Exception e) {
// exception never get cought
}
Также я использую cppFlags '-fexceptions'
. Есть ли правильный способ поймать это исключение или восстановить его, чтобы приложение не разбилось?
От: https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html#FindClass THROWS: NoClassDefFoundError: если определение для запрошенного класса или интерфейса не найдено , У JNI есть методы, чтобы выяснить, выбрано ли исключение Java и с которым оно связано. Исключение Java не «становится активным», пока не вернется метод JNI. –
java.lang.NoClassDefFoundError не получен из java.lang.Exception, а из java.lang.Error Вот почему ваше исключение не поймано. См. Https://docs.oracle.com/javase/7/docs/api/java/lang/NoClassDefFoundError.html –
Поскольку вы упоминаете флаг '-fexceptions', не путайте исключения Java и C++ - они полностью отдельные звери. – zenzelezz