Aktivieren Sie die C ++ 11-Unterstützung unter Android

73

Wie integriere ich C ++ 11 in Android?

JonasVautherin
quelle
Es ist nicht erforderlich, eine neue Frage zu erstellen. Beantworten Sie einfach Ihre ursprüngliche Frage.
LittleBobbyTables - Au Revoir
9
Da es bei der ursprünglichen Frage um die Verwendung von "unordered_map" ging, hielt ich es für interessant, eine Frage zur Integration von C ++ 11 unter Android zu haben, da ich einige Zeit gebraucht habe und etwas anders bin. Ich bin übrigens froh, eine Down-Abstimmung über eine Wiki-Frage zu bekommen ;-).
JonasVautherin
1
Erwischt. Vermutlich hat jemandem die Frage nicht gefallen: |
LittleBobbyTables - Au Revoir

Antworten:

70

Es scheint, dass die Hauptantwort hier experimentelle Unterstützung für C ++ 11 beinhaltet, und C ++ 11 ist nicht mehr experimentell.

Wenn Sie die Befehlszeilen-NDK-Unterstützung verwenden (ich verwende IDEA Community Edition 13 für Java), musste ich Folgendes eingeben jni/Application.mk, um C ++ 11-Unterstützung mit API 19 (unter OSX ML) zu erhalten:

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

Abgeleitet von hier und hier .

scorpiodawg
quelle
1
Das Hinzufügen LOCAL_CPPFLAGS := -stc=c++11zu meinem hat Android.mkauch für mich funktioniert.
Greg
37

Zunächst müssen Sie sicherstellen, dass Ihre Toolchain "Cross GCC" ist. Während es unter meinem Linux die Standardeinstellung war, war es nicht auf meinem MacOSX Lion.

Gehen Sie dazu zu Projekteigenschaften> C / C ++ Build> Tool Chain Editor . " Aktuelle Toolchain " sollte auf " Cross GCC " eingestellt sein. Möglicherweise müssen Sie das Kontrollkästchen " Nur kompatible Toolchains anzeigen" deaktivieren .

Fügen Sie dann eine Option zu LOCAL_CFLAGS in Android.mk hinzu :

LOCAL_CFLAGS := -std=gnu++11

Wir müssen Eclipse nun darüber informieren, wo die entsprechenden neuen Symbole zu finden sind (z. B. "std :: unordered_map"). Gehen Sie zu Rechtsklick auf "jni"> Eigenschaften> C / C ++ Allgemein -> Pfade und Symbole -> Symbole -> GNU C ++ und fügen Sie das folgende Symbol hinzu (indem Sie auf "Hinzufügen ..." klicken):

Name: __GXX_EXPERIMENTAL_CXX0X__
Value:

(dh "Wert" leer lassen)

JonasVautherin
quelle
@yakk: Das dauert normalerweise 2 Tage.
Moswald
Ich habe einige Probleme damit. Ich benutze Windows und kompiliere über cmd. Ich habe LOCAL_CFLAGS: = -D__GXX_EXPERIMENTAL_CXX0X__ -std = gnu ++ 11 in meine make-Datei eingefügt, aber wenn ich den Befehl ndk-build ausführe, erhalte ich Fehler an Stellen, an denen unordered_map verwendet wird ('unordered_map' benennt keinen Typ). Code funktioniert in Linux- und Windows-Ports meines Programms. Irgendwelche Ideen, was falsch sein könnte? Das von mir verwendete NDK ist das neueste verfügbare (heute heruntergeladene).
SMGhost
3
Wenn Sie mehr als ein Modul haben und das Flag für alle Dateien aktivieren möchten, können Sie das Flag zur Variablen APP_CPPFLAGS in der Datei Application.mk hinzufügen.
Hara
2
In meiner Antwort unten finden Sie eine aktuellere Version der jetzt standardisierten C ++ 11 STL.
Scorpiodawg
Was passiert mit STLport? Es scheint eine der C + -Bibliotheken zu sein, die durch Definition vorgibt, C ++ 11 zu sein __cplusplus >= 201103L. STLport fehlt <mutex>, <atomics>usw.
JWW
7

Sie können dies auch in Ihrer build.gradle- Datei festlegen , wenn Sie das Gradle-Experimental-Plugin verwenden :

android.ndk {
    moduleName = "hello-android-jni"
    stl = "stlport_shared"
    cppFlags.add("-std=c++11")
}
Yuchen Zhong
quelle
Das funktioniert nicht. Es sagt mir, dass cppFlags nicht gefunden werden können.
Seth
Hey @Seth, viele Dinge könnten schief gehen. Hast du sichergestellt, dass du die richtige Version des Gradle-Plugins und die richtige Version des Gradle selbst verwendet hast? Dies ist eine großartige Gilde, wenn du sie nicht gelesen hast. tools.android.com/tech-docs/new-build-system/…
Yuchen Zhong
Vielen Dank. Aber leider habe ich jeden Leitfaden da draußen gelesen. lol. Ich habe nur pthreadanstelle vonthread
Seth
1

Mit dem neuesten Gradle-Experimental-Plugin 0.8.0-alpha4 fügen Sie Ihrer App / build.gradle Folgendes hinzu :

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