2013-06-17 14 views
16

Ich versuche, C++ 11 Threading-Funktionen mit Android NDK zu verwenden, aber nicht sicher, wie es die neuesten Compiler verwenden.Neueste C++ 11 Funktionen mit Android NDK

Ich habe Clang 3.2 und kann iOS-Apps erstellen. Ich frage mich, ob es einen Weg gibt, es mit Android NDK zu tun?

Wenn nicht, wie sollte ich dann mit gcc 4.8 bauen?

+0

Siehe z.B. http://stackoverflow.com/questions/15269496/how-to-compile-c11-code-with-android-ndk-and-eclipse und http: // stackoverflow.com/questions/14014659/android-ndk-error-muss-aktiviert-mit-der-std-c11-oder-std-gnu11-compiler – Michael

+0

@Michael, ich muss mit clang 3,2 oder gcc 4,8 bauen, oder sein sicher, dass es nicht möglich ist und pthreads verwenden. – Kimi

+0

Seit NDK Revision 10d - GCC 4.8 ist der Standard für alle 32-Bit ABIs –

Antwort

12

NDK Revision 10 der Clang 3.6 Toolchain hat. Verwenden Sie es:

NDK_TOOLCHAIN_VERSION := clang3.6 

oder die neuesten verfügbaren Clang verwenden Toolchain

NDK_TOOLCHAIN_VERSION := clang 
+0

Seltsam, 'clang3.6' verwendet 3.8 für mich (derzeit das neueste auf 5.1.1, überprüft über Präprozessor' # ifdef'), wie 'clang'. Und 'clang3.8' ist ein Fehler. –

2

NDK revision 8e hat den Clang 3.2 Compiler gebündelt. Benutze es und du bist gut zu gehen.

+0

Sie können einen Compiler auf diese Weise verwenden, aber es gibt noch etwas anderes zu tun Threading (ich benutze APP_STL: = gnustl_static) seit ich bin Fehler erhalten: kein Member namens 'thread' im Namespace 'std'; meinst du "fread"? – Kimi

+0

@Kimi die NDK-Dokumentation in '$ NDK/docs/STABLE-APIS.html' sagt folgendes:' Beachten Sie, dass die Android C-Bibliothek Unterstützung für Pthread () enthält, daher wird "LOCAL_LIBS: = -lpthread" nicht benötigt. Dasselbe gilt für Echtzeiterweiterungen (-lrt bei typischen Linux-Distributionen) '. Können Sie die Probleme, mit denen Sie konfrontiert sind, in die Frage einfügen, da dies die Verfolgung des Problems erleichtert? – Samveen

1

Zuerst entscheiden, welche Werkzeugkette zu verwenden, Ihre "application.mk" bearbeiten (nicht zu verwechseln mit android.mk) und legen Sie für gcc 4.8:

NDK_TOOLCHAIN_VERSION := 4.8 

oder wenn Sie Klirren wollen:

NDK_TOOLCHAIN_VERSION := clang 

Das hat aber nichts mit Threads zu tun. Dies definiert nur, welche Toolchain zu verwenden ist.

Jetzt über Themen, hier ist ein einfaches Beispiel für Android NDK:

#include <pthread.h> // <--- IMPORTANT 

// This will be used to pass some data to the new thread, modify as required 
struct thread_data_arguments 
{ 
    int value_a 
    bool value_b; 
}; 

//--------------------------------- 

// This function will be executed in the new thread, do not forget to put * at the start of the function name declaration 
void *functionRunningInSeparateThread(void *arguments) 
{ 
    struct thread_data_arguments *some_thread_arguments = (struct thread_data_arguments*)arguments; 

    if (some_thread_arguments->value_b == true) 
    { 
     printf("VALUE= %i", some_thread_arguments->value_a); 
    } 

    // Signal the end of the thread execution 
    pthread_exit(0); 
} 

//--------------------------------- 

// This is the actual function creating and starting the new thread 
void startThread() 
{ 
    // Lets pass some data to the new thread, you can pass anything even large data, 
    // for that you only need to modify thread_data_arguments as required 
    struct thread_data_arguments *some_thread_arguments; 
    some_thread_arguments = (thread_data_arguments*)malloc(sizeof(*some_thread_arguments)); 

    some_thread_arguments->value_a = 12345; 
    some_thread_arguments->value_b = true; 

    // Create and start the new thread 
    pthread_create(&native_thread, NULL, functionRunningInSeparateThread, (void*)some_thread_arguments) 
} 
1

Für NDK baut, offene Application.mk und folgende Informationen hinzuzufügen. in es (bei Verwendung von R8e):

NDK_TOOLCHAIN_VERSION=4.7 

Hinweis: Bitte verwenden 4.8 im Fall verwenden Sie NDK Revision 9.

18

(Ich bin die NDK Version R9b Adressierung) Um C++ 11-Unterstützung für alle Quellcode der Anwendung zu aktivieren (und so alle Module enthalten) die folgende Änderung in der Application.mk machen:

# use this to select gcc instead of clang 
NDK_TOOLCHAIN_VERSION := 4.8 
# OR use this to select the latest clang version: 
NDK_TOOLCHAIN_VERSION := clang 


# then enable c++11 extentions in source code 
APP_CPPFLAGS += -std=c++11 
# or use APP_CPPFLAGS := -std=gnu++11 

Andernfalls, wenn Sie möchten, C++ 11-Unterstützung haben, nur in Ihrem Modul, fügen Sie diese Zeilen in Ihre Androi d.mk statt Verwendung APP_CPPFLAGS

LOCAL_CPPFLAGS += -std=c++11 

Lesen Sie mehr hier: http://adec.altervista.org/blog/ndk_c11_support/

0

Beachten Sie, dass Android gcc Unterstützung jetzt ist veraltet. Sie sollten jetzt Klänge verwenden. Bitte lesen Sie die version 11 release notes. Sie können Folgendes angeben:

NDK_TOOLCHAIN_VERSION=clang 

So verwenden Sie die neueste Version basierend auf Ihrem installierten NDK. Außerdem ist das neueste NDK (v12) ab diesem Zeitpunkt nur über Android Studio zugänglich und nicht über die Download-Seite oder den Standalone SDK Manager.