AndroidのネイティブC++コードでエラーをキャッチしようとしています。ドキュメントによると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スロー: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