Android NDK的最新C ++ 11功能

时间:2013-06-17 07:53:45

标签: android gcc c++11 android-ndk clang

我正在尝试使用Android NDK的C ++ 11线程工具,但不确定如何使用最新的编译器。

我有Clang 3.2并且可以构建iOS应用程序。我想知道是否有办法用Android NDK做到这一点?

如果没有,那么我应该如何用gcc 4.8构建?

6 个答案:

答案 0 :(得分:18)

(我正在解决NDK版本r9b) 要为应用程序的所有源代码(以及所包含的任何模块)启用C ++ 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

否则,如果您希望仅在模块中支持C ++ 11,请将此行添加到Android.mk中,而不是使用APP_CPPFLAGS

LOCAL_CPPFLAGS += -std=c++11

在这里阅读更多内容: http://adec.altervista.org/blog/ndk_c11_support/

答案 1 :(得分:12)

NDK修订版10具有Clang 3.6工具链。使用它:

NDK_TOOLCHAIN_VERSION := clang3.6

或使用最新的Clang工具链

NDK_TOOLCHAIN_VERSION := clang

答案 2 :(得分:2)

NDK revision 8e捆绑了Clang 3.2编译器。使用它,你就可以了。

答案 3 :(得分:1)

首先,要决定使用哪个工具链,请编辑“application.mk”(不要与android.mk混淆)并插入gcc 4.8:

NDK_TOOLCHAIN_VERSION := 4.8

或者如果你想要铿锵声:

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)
}

答案 4 :(得分:1)

对于ndk构建,请打开Application.mk并添加以下信息。在其中(如果使用r8e):

NDK_TOOLCHAIN_VERSION=4.7

注意:如果您使用NDK修订版9,请使用4.8。

答案 5 :(得分:0)

请注意, Android gcc支持现已弃用。你现在应该使用clang。请阅读version 11 release notes。您可以指定:

NDK_TOOLCHAIN_VERSION=clang

根据已安装的NDK使用最新版本。此外---在撰写本文时---最新的NDK(v12)只能通过Android Studio访问,而不能通过“下载”页面或独立SDK管理器访问。