Подтвердить что ты не робот

Последние возможности С++ 11 с Android NDK

Я пытаюсь использовать средства потоковой передачи С++ 11 с Android NDK, но не уверен, как заставить его использовать последние компиляторы.

У меня есть Clang 3.2 и вы можете создавать приложения для iOS. Интересно, есть ли способ сделать это с Android NDK?

Если нет, то как мне построить gcc 4.8?

4b9b3361

Ответ 1

Версия NDK 10 содержит инструментальную цепочку Clang 3.6. Используйте его:

NDK_TOOLCHAIN_VERSION := clang3.6

или используйте последнюю доступную инструментальную цепочку Clang

NDK_TOOLCHAIN_VERSION := clang

Ответ 2

(Я обращаюсь к версии NDK r9b) Чтобы включить поддержку С++ 11 для всего исходного кода приложения (и, следовательно, любые модули включены), внесите следующие изменения в 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

В противном случае, если вы хотите иметь поддержку С++ 11 только в своем модуле, добавьте эти строки в свой Android.mk вместо использования APP_CPPFLAGS

LOCAL_CPPFLAGS += -std=c++11

Подробнее здесь: http://adec.altervista.org/blog/ndk_c11_support/

Ответ 3

Версия NDK 8e содержит компилятор Clang 3.2. Используйте его, и вы хорошо пойдете.

Ответ 4

Сначала, чтобы решить, какую toolchain использовать, отредактируйте свой "application.mk" (не путайте с android.mk) и вставьте для gcc 4.8:

NDK_TOOLCHAIN_VERSION := 4.8

или если вы хотите clang:

NDK_TOOLCHAIN_VERSION := clang

Но это не имеет ничего общего с потоками. Это определит только, какую инструментальную строку использовать.

Теперь о потоках, вот простой пример для 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)
}

Ответ 5

Для создания ndk откройте Application.mk и добавьте следующую информацию. в нем (при использовании r8e):

NDK_TOOLCHAIN_VERSION=4.7

Примечание. Используйте версию 4.8, если вы используете версию NDK 9.

Ответ 6

Обратите внимание, что поддержка gcc для Android теперь устарела. Теперь вы должны использовать clang. Пожалуйста, прочтите примечания версии 11. Вы можете указать:

NDK_TOOLCHAIN_VERSION=clang

Использовать последнюю версию на основе установленного NDK. Также --- на момент написания --- последний NDK (v12) доступен только через Android Studio, а не через страницу "Загрузки" или "Автономный диспетчер SDK".