2010-07-10 11 views
19

Próbuję utworzyć macierzysty kod aplikacji dla systemu Android. Kod macierzysty znajduje się w cplusplus. Zawsze, gdy próbuję wykonać, pojawia się następujący błąd.Włącz wyjątek C++

H236Plus.cpp:135: error: exception handling disabled, use -fexceptions to enable

Jak korzystać z wyjątków w celu włączenia obsługi wyjątków i gdzie go używać?

+0

Aby włączyć go z NDK-build, użyj nowej zmiennej LOCAL_CPP_FEATURES w Android.mk, jak w: LOCAL_CPP_FEATURES + = wyjątków – hB0

Odpowiedz

5

Musisz zbudować z CrystaX za custom NDK. Ma pełne wsparcie dla libstdC++, RTTI i wyjątków. Zwykle jest to najlepsze narzędzie do programowania Androida, jakie znam.

4

-wykluczenie jest przełącznikiem kompilatora. Sposób korzystania z niego zależy od konfiguracji kompilatora. Z jakiego kompilatora korzystasz? IDE? zbudować narzędzie?

+0

NDK z Cygwin. Wszystko, co zrobiłem, to wpisać "make APP = project" w cygwin w katalogu katalogu ndk. – Gidiyo

+0

Powinien być plik Makefile w tym katalogu. Kontroluje to, jak wszystko jest skompilowane. To miejsce, w którym należy szukać przełączników kompilatora. – EricSchaefer

+0

Czy to ** - fexception ** lub ** - fexceptions **? –

3

W flagach kompilatora dodaj wyjątek-klasy do pliku Makefile.

+0

Czy to kiedykolwiek zadziałało? Dzięki temu będziesz miał -na wyjątki wraz z -wyjątkami. – ognian

+0

Na pewno trzeba usunąć wyjątki -na wyjątki, aby wprowadzić reguły wyjątków? – marienke

26

Zależy to od czasu, z którego korzystasz. Jeśli nie używasz systemu czasu pracy i budują z ndk-build, dodać każdy z nich do pliku Android.mk:

  • LOCAL_CPP_FEATURES + = wyjątki (zalecane)
  • LOCAL_CPPFLAGS + = -fexceptions

Ponadto, można dodać następującą linię do pliku Application.mk:

  • APP_CPPFLAGS + = -fexceptions

Jest więcej informacji na docs/CPLUSPLUS-SUPPORT.html w folderze NDK

1

I rozwiązać ten problem poprzez dodanie CFLAGS "-fexceptions" w sekcji NDK skryptu build.gradle, tak:

ndk { 
    ... 
    cFlags "-fexceptions" 
} 
2

z najnowsza wersja Android Studio to co moja build.gradle wygląda następująco:

model { 
    android { 
     compileSdkVersion 23 
     buildToolsVersion "23.0.2" 

     buildTypes { 
      release { 
       minifyEnabled false 
       shrinkResources false 
       proguardFiles.add(file("proguard-rules.txt")) 
       signingConfig = $("android.signingConfigs.release") 
      } 
     } 

     defaultConfig { 
      applicationId "my.android.app" 
      minSdkVersion.apiLevel 16 
      targetSdkVersion.apiLevel 23 
      versionCode 29 
      versionName "my.latest.version" 
     } 

     ndk { 
      moduleName "jni-utils" 
      ldLibs.add("log") 
      cppFlags.add("-std=c++11") 
      cppFlags.add("-fexceptions") 
      stl "gnustl_static" 
     } 
    } 
    android.signingConfigs { 
     create("release") { 
      storeFile "C:\\Android\\Git\\MyProject\\keystore\\keystoreCommon" 
      storePassword "put you password here" 
      keyAlias "put your alias here" 
      keyPassword "put your password here" 
     } 
    } 
} 
0

Patrz this odpowiedź @Tundebabzy, jeśli korzystasz z systemu kompilacji ndk-build.

Dla systemu CMake build

dodaj następującą do modułu poziomie build.gradle plik:

android { 
    ... 
    defaultConfig { 
    ... 
    externalNativeBuild { 

     // For ndk-build, instead use ndkBuild {} 
     cmake { 
     // Enables exception-handling support. 
     cppFlags "-fexceptions" 
     } 
    } 
    } 
} 
... 

uzyskać więcej informacji Zobacz this Link.