我正在尝试将 C++11 线程工具与 Android NDK 一起使用,但不确定如何使其使用最新的编译器。
我有 Clang 3.2 并且可以构建 iOS 应用程序。我想知道是否有办法用 Android NDK 做到这一点?
如果没有,那么我应该如何使用 gcc 4.8 构建?
我正在尝试将 C++11 线程工具与 Android NDK 一起使用,但不确定如何使其使用最新的编译器。
我有 Clang 3.2 并且可以构建 iOS 应用程序。我想知道是否有办法用 Android NDK 做到这一点?
如果没有,那么我应该如何使用 gcc 4.8 构建?
(我正在处理 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/
NDK 修订版 10 具有 Clang 3.6 工具链。用它:
NDK_TOOLCHAIN_VERSION := clang3.6
或使用最新可用的 Clang 工具链
NDK_TOOLCHAIN_VERSION := clang
NDK 修订版 8e中捆绑了 Clang 3.2 编译器。使用它,你很高兴。
首先,要决定使用哪个工具链,编辑您的“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)
}
对于 ndk 构建,打开 Application.mk 并添加以下信息。在其中(如果使用 r8e):
NDK_TOOLCHAIN_VERSION=4.7
注意:如果您使用的是 NDK 修订版 9,请使用 4.8。
请注意,Android gcc 支持现已弃用。您现在应该使用 clang。请阅读版本 11 发行说明。您可以指定:
NDK_TOOLCHAIN_VERSION=clang
根据您安装的 NDK 使用最新版本。此外——在撰写本文时——最新的 NDK (v12) 只能通过 Android Studio 访问,不能通过下载页面或独立 SDK 管理器访问。