2016-10-17 1 views
0

Android의 기본 C++ 코드에서 오류를 catch하려고합니다. 문서에 따르면 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 블록을 건너 뛰고 응용 프로그램을 중단합니다. 내 자바 코드 :

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

public native void testError(); 

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

이 또한 내가 cppFlags '-fexceptions'를 사용합니다. 이 예외를 잡거나 앱에서 오류가 발생하지 않도록 복구하는 적절한 방법이 있습니까?

+0

https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html#FindClass 참 고 : NoClassDefFoundError : 요청한 클래스 또는 인터페이스에 대한 정의를 찾을 수없는 경우 . JNI에는 Java 예외가 던져지고 처리되는지 확인하는 메소드가 있습니다. Java 예외는, JNI 메소드가 복귀 할 때까지 「액티브하게」되지 않습니다. –

+0

java.lang.NoClassDefFoundError는 java.lang.Exception에서 파생되지 않고 java.lang.Error에서 파생됩니다. 따라서 예외가 발견되지 않는 것입니다. https://docs.oracle.com/javase/7/docs/api/java/lang/NoClassDefFoundError.html –

+0

을 참조하십시오. '-fexceptions' 플래그를 언급 했으므로 Java 및 C++ 예외를 혼동하지 마십시오. 완전히 완료되었습니다 별개의 짐승들. – zenzelezz

답변

0

먼저, 모든 JNI 호출 후에이 코드를 사용해야하는 등,에 FindClass에 충돌에서 네이티브 코드를 방지하기 위해 :

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

둘째, 네이티브 코드에서 발생한 모든 충돌을 확실히 catch하려면이 try-catch를 사용해야합니다. @ 리차드 Critten는 또한 모든 기본 기능을 사용 크레딧 호출

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

그리고 CPPFLAGS '-fexceptions은'당신이 그것을 제거 할 수 있도록 그것을 할 수 없다.