gpt4 book ai didi

android - 在 Android NDK C++ 代码中捕获异常

转载 作者:行者123 更新时间:2023-11-28 05:28:11 26 4
gpt4 key购买 nike

我试图在 Android 上捕获原生 C++ 代码中的错误。根据文档 FindClass 在找不到类名时返回 NULL。但是我得到了 FATAL EXCEPTION: 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;
}
}

此异常还会跳过 try-catch block 并使应用程序崩溃。我的 Java 代码:

static {
System.loadLibrary("native-lib");
}

public native void testError();

...
try {
testError();
} catch (Exception e) {
// exception never get cought
}

我还使用 cppFlags '-fexceptions'。是否有正确的方法来捕获此异常或从中恢复以使应用程序不会崩溃?

最佳答案

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

bool checkExc(JNIEnv *env) {
if (env->ExceptionCheck()) {
env->ExceptionDescribe(); // writes to logcat
env->ExceptionClear();
return true;
}
return false;
}

实际上,ExceptionClear() 阻止了崩溃。我在这个答案上找到了代码 https://stackoverflow.com/a/33777516/2424777

其次,要确保从 native 代码中捕获所有崩溃,您必须使用此 try-catch。 Credits @Richard Critten 还在所有 native 函数调用中使用它:

static {
try {
System.loadLibrary("native-lib");
} catch (Error | Exception ignore) { }
}

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

关于android - 在 Android NDK C++ 代码中捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40096235/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com