2013-06-17 21 views
16

Próbuję korzystać z funkcji wątków C++ 11 z Androidem NDK, ale nie wiem, jak sprawić, by korzystał z najnowszych kompilatorów.Najnowsze funkcje C++ 11 z Androidem NDK

Mam Clang 3.2 i mogę tworzyć aplikacje na iOS. Zastanawiam się, czy jest jakiś sposób na zrobienie tego z Androidem NDK?

Jeśli nie, to w jaki sposób należy zbudować z gcc 4.8?

+0

Zobacz np. http://stackoverflow.com/questions/15269496/how-to-compile-c11-code-with-android-ndk-and-eclipse i http: // stackoverflow.com/questions/14014659/android-ndk-error-musi-być-włączony-z-std-c11-lub-std-gnu11-kompilator – Michael

+0

@ Michael, muszę zbudować z clang 3.2 lub gcc 4.8 lub być upewnij się, że nie jest to możliwe i użyj pthreads. – Kimi

+0

Od wersji NDK 10d - GCC 4.8 jest domyślnie dla wszystkich 32-bitowych ABI –

Odpowiedz

12

NDK wersja 10 ma z brzękiem 3.6 toolchain. Użyj go:

NDK_TOOLCHAIN_VERSION := clang3.6 

lub korzystać z najnowszej dostępnej dzyń toolchain

NDK_TOOLCHAIN_VERSION := clang 
+0

Weird, 'clang3.6' używa 3.8 dla mnie (obecnie najnowszy na 5.1.1, sprawdzany przez preprocesor' # ifdef'), jak 'clang'. A 'clang3.8' jest błędem. –

2

NDK revision 8e ma dołączony kompilator Clang 3.2. Użyj go i dobrze jest iść.

+0

Możesz użyć kompilatora w ten sposób, ale jest jeszcze coś do zrobienia, aby użyć wątku (używam APP_STL: = gnustl_static), ponieważ jestem uzyskanie błędu błędu: brak członka o nazwie "wątek" w przestrzeni nazw "std"; miałeś na myśli "fread"? – Kimi

+0

@Kimenda NDK w '$ NDK/docs/STABLE-APIS.html' mówi co następuje:' Zauważ, że biblioteka Android C zawiera obsługę pthread (), więc "LOCAL_LIBS: = -lpthread" nie jest potrzebne. To samo dotyczy rozszerzeń w czasie rzeczywistym (-lrt w typowych dystrybucjach Linuksa) '. Czy możesz wkleić pytania, które napotkasz, ponieważ ułatwi to prześledzenie problemu? – Samveen

1

Po pierwsze, aby zdecydować, które toolchain w obsłudze, edycji "application.mk" (nie mylić z android.mk) i wstawić do gcc 4.8:

NDK_TOOLCHAIN_VERSION := 4.8 

lub jeśli chcesz szczęk:

NDK_TOOLCHAIN_VERSION := clang 

Ale to nie ma nic wspólnego z wątkami. To tylko określi, który zestaw narzędzi do użycia.

Teraz o wątkach, oto prosty przykład dla 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

Dla NdK buduje, otwarte Application.mk i dodać następujące informacje. w przypadku korzystania z niego (R 8e):

NDK_TOOLCHAIN_VERSION=4.7 

Uwaga: Proszę używać 4.8 W przypadku korzystania rewizji NDK 9.

18

(jestem adresowania wersji R9b NDK) Aby włączyć C++ 11 Wsparcie dla wszystkich kodu źródłowego aplikacji (a więc wszelkie moduły dołączone) wprowadzić następujące zmiany w Application.mk:

# 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 

w przeciwnym razie, jeśli chcesz mieć wsparcie C++ 11 tylko w module, należy dodać do swojej linii Android.Gizm d.mk zamiast stosowania APP_CPPFLAGS

LOCAL_CPPFLAGS += -std=c++11 

Czytaj więcej tutaj: http://adec.altervista.org/blog/ndk_c11_support/

0

Zauważ, że Android gcc wsparcie jest obecnie nieaktualna. Powinieneś teraz używać klang. Przeczytaj version 11 release notes. Można określić:

NDK_TOOLCHAIN_VERSION=clang 

Aby użyć najnowszej wersji na podstawie zainstalowanego NDK. Również - od tego pisania - najnowszy NDK (v12) jest dostępny tylko za pośrednictwem Android Studio, a nie za pośrednictwem strony pobierania lub Standalone SDK Manager.

Powiązane problemy