15

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

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

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

4

6 回答 6

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/

于 2013-11-09T10:20:15.413 回答
11

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

NDK_TOOLCHAIN_VERSION := clang3.6

或使用最新可用的 Clang 工具链

NDK_TOOLCHAIN_VERSION := clang
于 2013-10-05T21:51:54.650 回答
2

NDK 修订版 8e中捆绑了 Clang 3.2 编译器。使用它,你很高兴。

于 2013-06-19T05:09:46.513 回答
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)
}
于 2013-08-12T18:07:58.060 回答
1

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

NDK_TOOLCHAIN_VERSION=4.7

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

于 2013-10-05T21:48:31.133 回答
0

请注意,Android gcc 支持现已弃用。您现在应该使用 clang。请阅读版本 11 发行说明。您可以指定:

NDK_TOOLCHAIN_VERSION=clang

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

于 2016-04-22T20:24:29.497 回答