2011-01-11 3 views
13

++ 예외 : 그러나 모든안드로이드 NDK R5와 C의 지원을 나는 NDK 5 완전 C++ gnustl 사용하는 것을 시도하고있다

NDK 툴 체인은 NDK R5 때문에, C++ 예외를 지원합니다

CPLUSPLUS-SUPPORT.html 상태를 C++ 소스는 이전 릴리스와의 호환성 이유로 에 대해 기본적으로 -fno-exceptions 지원으로 컴파일됩니다.

활성화하려면 '-fexceptions'C++ 컴파일러 플래그를 사용하십시오. 이것은 당신의 Android.mk의 모든 모듈 정의에 다음을 추가하여 을 수행 할 수 있습니다

LOCAL_CPPFLAGS += -fexceptions 

더 간단하게, 당신의 Application.mk에 한 줄을 추가을 설정이 는 자동으로 모든 프로젝트의 NDK에 적용됩니다 모듈 :

APP_CPPFLAGS += -fexceptions 

sources/cxx-stl/gnu-libstdc++/README 상태 :

이 디렉토리의 공동 GNU libstdC++ - v3 C++ 표준 템플릿 라이브러리 구현을위한 헤더와 사전 빌드 된 바이너리를 포함합니다.

빌드/도구 아래의 rebuild-all-prebuilt.sh 스크립트에 의해 도구 체인 소스에서 생성됩니다.

사용하려면 Application.mk에서 APP_STL을 'gnustl_static'로 정의하십시오. 자세한 내용은 docs/CPLUSPLUS-SUPPORT.html을 참조하십시오.

이 구현은 C++ 예외 및 RTTI를 완전히 지원합니다.

그러나 예외를 사용하는 모든 시도는 실패합니다. 대체 NDK가 http://www.crystax.net/android/ndk-r4.php에 있습니다. 해당 NDK의 hello-jni 예제를 사용하면 작동하지 않습니다.

APP_STL := gnustl_static 

gnustl_static에 APP_STL 설정을 가진 Application.xml을 만든 후 NDK 5 개 작품과 함께 컴파일시는 자동으로 -frtti-fexceptions 수 있습니다. 그러나 그것은 내 자신의 실험과 같은 끔찍한 죽음으로 죽는다.

나를 위해 충돌되는 코드의 최소한의 예를 얻는 것을 처리했다 :

try { 
    __android_log_write(ANDROID_LOG_DEBUG,"foobar","trhown!"); 
    throw "Wrong object type."; 
} catch (char* b) { 
    __android_log_write(ANDROID_LOG_DEBUG,"foobar","catched!"); 
} 

오전 내가 놓친 거지 뭔가를하거나 READMECPLUSPLUS-SUPPORT.html 그냥 일반 잘못의 문은 무엇입니까?

+0

아마도 그것이 미래 NDK의 릴리스에서 수정 될 수

... 그래서 그것의 도움을 하드; 예외, RTTI 및 static_gnustl은 NDK-r5에서 작동합니다. – grrussel

+0

충돌이 발생한 예제를 추가했습니다. – plaisthos

+0

인수 V = 1을 사용하여 ndk_build 명령을 호출하면 빌드 및 링크 명령이 표시됩니다. 충돌이 예외로 인한 것인지 확실합니까? – grrussel

답변

8

예외가 std :: exception에서 상속 된 경우에만 예외가 발생합니다. 내 경우에는 예외 계층 구조가 항상 catch/throw를 중단 한 std :: exception을 포함하지는 않습니다. 궁극적으로 예외를 던지는 문자열은 x86/Mac OS 용으로 컴파일 될 때 작동합니다. 내가 사용하는 예외를 수정하여 내 문제를 해결했습니다.

+2

C++에서 std :: exception에서 파생되지 않은 유형의 사용은 상당히 합법적이므로 OSX에서 작동한다는 것은 놀라운 일이 아닙니다. 내가 작업하는 코드베이스는 예외로 정수를 던지고 안드로이드에서 작동합니다. – grrussel

+1

ndk에는 개별 버전의 stdC++가 제공되며, 하나는 gnu 구현을 제공합니다. /android-ndk-r5b/sources/cxx-stl/gnu-libstdc++/libs/armeabi/libstdc++.a와 명시 적으로 링크하면 문제가 사라졌습니다. 그러나 더 쉬운 방법이 있다고 확신합니다. – paniq

1

내가 아는 한, Android NDK는 예외를 지원하지 않습니다. libstdC++ 자체는 예외를 지원하지만 안드로이드 용으로 컴파일되면 예외 지원이 해제됩니다 ("-fno-exceptions"에 대한 grep).

android ndk 메일 링리스트의 this thread을 참조하십시오.

+2

버전 r5의 예외/rtti ist 신규 지원. 변화와 gnustl의 README에 따르면 그것은 지원되어야합니다. – plaisthos

+0

http://developer.android.com/sdk/ndk/index.html 여전히 "C++ 예외가 있으며 RTTI는 기본 STL 구현에서 지원되지 않습니다." 일반 노트 섹션에 있습니다. r5에서 예외 지원이 활성화되었다는 것을 어디에서 알 수 있습니까? 그리고 예, 그들이 사용하는 표준 라이브러리 구현은 예외를 지원하지만, 안드로이드 용으로 컴파일 할 때 예외를 명시 적으로 비활성화합니다. (또는 적어도 r4까지 올라간다) –

+0

Crystax ndk를 시도했을 때, 이것을 다시 읽었으니, libstdC++의 전체 컴파일을 패치로하고 hello-jni를 libstdC++에 링크 시키거나 그렇게 했는가? hello-jni에있는 코드를 사용하고 기본 libstdC++에 링크하면됩니까? 전자는 완전한 예외 지원을 제공해야합니다. 후자는 끔찍하게 죽을 것이다. –

7

NDK-r5 도구는 C++ 코드에서 예외 및 RTTI 사용을 지원합니다. 그러나 정적 라이브러리로 GNU STL 이외의 STL을 사용하는 것은 RTTI 또는 예외가있는 경우에는 지원되지 않습니다.

제공된 STLport는 예외 또는 RTTI와 함께 사용할 수 없습니다.

STL 구현간에 스와핑 할 때 빌드 개체를 정리해야 할 수도 있습니다.

+0

질문을 올바르게 읽지 않았습니다. – paniq

+1

이 질문은 예외 지원에 대한 NDK 문서 진술이 잘못되었는지 질문합니다. 그렇지 않습니다. – grrussel

+3

이 경우 나는 당신의 대답을 정확하게 읽지 못했습니다. – paniq

1

JNI를 사용하여 비슷한 문제가 있습니다. JNI 메소드로부터 발생 된 모든 예외는 Android 1.6 및 2.1에서 SIGILL 오류를 발생시킵니다. 그것은 (코멘트를 그것을 위해 투표 또는 게시하는 것을 망설이지 말라) 내 문제를 참조

안드로이드 2.2에서 잘 작동 것 :

http://code.google.com/p/android/issues/detail?id=20176 그래서

, 현재, 안드로이드 1.6 및 2.1하지 않습니다 마지막 NDK가있는 JNI 메서드의 예외를 지원합니다. 당신은 당신의 실패, 무엇 말했다하지 않은