簡體   English   中英

在Android NDK C ++代碼中捕獲異常

[英]Catch exception in Android NDK C++ code

我正在嘗試在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塊並使應用程序崩潰。 我的Java代碼:

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

public native void testError();

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

我也使用cppFlags '-fexceptions' 是否有適當的方法來捕獲此異常或從中恢復以確保應用程序不會崩潰?

首先,為防止本機代碼在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

其次,要確保從本機代碼捕獲所有崩潰,您必須使用此try-catch。 積分@Richard Critten也可以在所有本機函數調用上使用它:

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

而且cppFlags'-fexceptions'與它無關,因此您可以將其刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM