2013-03-25 6 views
71

Jak mogę zintegrować C++ 11 z Androidem?Włącz obsługę C++ 11 na Androidzie

+0

Nie ma potrzeby tworzenia nowego pytania, wystarczy odpowiedzieć na oryginalne pytanie. – LittleBobbyTables

+9

Ponieważ pierwotne pytanie dotyczyło "unordered_map", wierzyłem, że byłoby interesujące zadać pytanie o integrację C++ 11 na Androida, ponieważ zajęło mi to trochę czasu i jest nieco inne. Cieszę się, że mogę zagłosować na pytanie na wiki :-). – JonesV

+1

gotcha. Zgadnij, że komuś nie spodobało się pytanie: | – LittleBobbyTables

Odpowiedz

35

Przede wszystkim musisz upewnić się, że twój zestaw narzędzi to "Cross GCC". Chociaż był domyślny w moim Linuksie, nie był na moim MacOSX Lion.

Aby to zrobić, przejdź do: Właściwości projektu> Budowa C/C++> Edytor łańcuchów narzędzi. "Bieżący toolchain" należy ustawić na "Cross GCC". Być może trzeba odznaczyć pole "Wyświetlaj kompatybilne toolchains tylko".

Następnie dodać opcję LOCAL_CFLAGS w Android.mk:

LOCAL_CFLAGS := -std=gnu++11 

Teraz musimy poinformować Eclipse o tym, gdzie znaleźć odpowiednie nowe symbole (na przykład "std :: unordered_map"). Idź do prawym przyciskiem myszy na "JNI"> Właściwości> C/C++ Ogólne -> Ścieżki i symbole -> Symbole -> GNU C++, i dodaj następujący symbol (klikając "Dodaj ..."):

Name: __GXX_EXPERIMENTAL_CXX0X__ 
Value: 

(czyli niech „Value” pusty)

+0

@yakk: zwykle wymaga 2 dni na zaliczenie. – moswald

+0

Mam pewne problemy z tym. Używam okien i kompiluję przez cmd. Dodałem LOCAL_CFLAGS: = -D__GXX_EXPERIMENTAL_CXX0X__ -std = gnu ++ 11 w moim pliku make, ale kiedy uruchomię polecenie ndk-build, pojawia się błąd w miejscach, w których zastosowano unordered_map ("unordered_map" nie określa typu). Kod działa w portach Linux i Windows mojego programu. Jakieś pomysły, co może być nie tak? NDK, którego używam, to najnowszy dostępny (pobrany dzisiaj). – SMart

+3

Jeśli masz więcej niż jeden moduł i chcesz włączyć flagę dla wszystkich plików, możesz dodać flagę do zmiennej APP_CPPFLAGS w pliku Application.mk. – hara

65

wydaje główną odpowiedzi tutaj obejmuje eksperymentalne wsparcie dla C++ 11 i C++ 11 nie jest już eksperymentalna.

Jeśli korzystasz z obsługi NDK z wiersza poleceń (używam IDEA community edition 13 dla rzeczy w Javie), to właśnie to musiałem umieścić w moim jni/Application.mk, aby uzyskać obsługę C++ 11 z API 19 (w systemie OSX ML):

NDK_TOOLCHAIN_VERSION := 4.8 
# APP_STL := stlport_shared --> does not seem to contain C++11 features 
APP_STL := gnustl_shared 

# Enable c++11 extentions in source code 
APP_CPPFLAGS += -std=c++11 

Pochodzące z here i here.

+4

powinno to być zaakceptowaną odpowiedzią. – stevebot

7

Można również ustawić to w build.gradle pliku, jeśli używasz gradle-experimental-plugin:

android.ndk { 
    moduleName = "hello-android-jni" 
    stl = "stlport_shared" 
    cppFlags.add("-std=c++11") 
} 
+0

To nie działa. Mówi mi, że nie można znaleźć cppFlags. – Seth

+0

Hej, @Seth, wiele rzeczy może pójść nie tak, czy upewniłeś się, że użyłeś poprawnej wersji wtyczki gradle i właściwej wersji samego gradla? To świetna gildia, jeśli jej nie czytałeś. http://tools.android.com/tech-docs/new-build-system/gradle-experimental –

+0

Dzięki. Ale niestety przeczytałem każdy przewodnik tam. lol. Po prostu użyłem 'pthread' zamiast' thread' – Seth

1

z najnowszymi gradle-experimental-plugin 0.8.0 a4 dodać do app/build.gradle :

model { 
    android { 
     ndk { 
      moduleName "native" 
      CFlags.add("-std=c11") // Enable C11 support 
      ldLibs.add("log") 
     } 
    } 
}