在Android NDK C++;代码 我试图在Android上的本地C++代码中捕获错误。根据文档,当找不到类名时,FindClass返回NULL。但是我得到了致命的异常:main java.lang.NoClassDefFoundError:fake/class,执行永远不会到达if语句 #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; } }

在Android NDK C++;代码 我试图在Android上的本地C++代码中捕获错误。根据文档,当找不到类名时,FindClass返回NULL。但是我得到了致命的异常:main java.lang.NoClassDefFoundError:fake/class,执行永远不会到达if语句 #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; } },android,c++,android-ndk,java-native-interface,Android,C++,Android Ndk,Java Native Interface,我还使用了cppFlags'-feexceptions'。是否有合适的方法捕获此异常或从中恢复,以使应用程序不会崩溃?首先,为了防止本机代码在FindClass等上崩溃。在每次JNI调用后,您必须使用此代码: #include <string.h> #include <jni.h> extern "C" void Java_com_example_MainActivity_testError(JNIEnv *env, jobject) { jclass claz

我还使用了
cppFlags'-feexceptions'
。是否有合适的方法捕获此异常或从中恢复,以使应用程序不会崩溃?

首先,为了防止本机代码在FindClass等上崩溃。在每次JNI调用后,您必须使用此代码:

#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;
    }
}
bool checkExc(JNIEnv *env) {
    if (env->ExceptionCheck()) {
        env->ExceptionDescribe(); // writes to logcat
        env->ExceptionClear();
        return true;
    }
    return false;
}
实际上,ExceptionClear()停止了崩溃。我在这个答案上找到了密码

#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。Credits@Richard criten也在所有本机函数调用上使用它:

#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;
    }
}
static {
    try {
        System.loadLibrary("native-lib");
    } catch (Error | Exception ignore) { }
}

而cppFlags'-feexceptions'与此无关,因此您可以将其删除。

From:THROWS:NoClassDefFoundError:如果找不到请求的类或接口的定义。JNI有一些方法来查看是否抛出Java异常并处理它。Java异常在JNI方法返回之前不会“激活”。Java.lang.NoClassDefFoundError不是从Java.lang.exception派生的,而是从Java.lang.Error派生的。这就是为什么不会捕获异常。请参阅您提到的<> > fExcExp:<代码>标志,不要混淆java和C++异常——它们是完全分开的兽类。你们救了我的一天,希望我能投票X10,我使用第一个选项,工作得很好。有没有办法让它登录到Android studio logcat的
Error
类别?因为它是在
Info
类别中登录的,它有太多的日志,查找起来很困难。这对我帮助很大
#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;
    }
}