在Android上启用C ++ 11支持


73

如何将C ++ 11集成到Android中?


无需创建新问题,只需回答您原来的问题即可。
LittleBobbyTables-Au Revoir,2013年

9
由于最初的问题是关于使用“ unordered_map”的,所以我认为有一个关于在Android上集成C ++ 11的问题会很有趣,因为这花费了我一些时间,并且略有不同。顺便说一句,很高兴对维基问题投下反对票;-)。
JonasVautherin 2013年

1
知道了。猜猜有人不喜欢这个问题:
LittleBobbyTables-Au Revoir

Answers:


70

似乎这里的主要答案包括对C ++ 11的实验性支持,而C ++ 11不再是实验性的。

如果您使用的是命令行NDK支持(我将IDEA社区版本13用于Java东西),那么这就是我jni/Application.mk为获得API 19(在OSX ML上)获得C ++ 11支持而必须输入的内容:

NDK_TOOLCHAIN_VERSION := 4.8
# APP_STL := stlport_shared  --> does not seem to contain C++11 features
APP_STL := gnustl_shared

# Enable c++11 extentions in source code
APP_CPPFLAGS += -std=c++11

这里这里


1
添加LOCAL_CPPFLAGS := -stc=c++11到我Android.mk也为我工作。
格雷格

37

首先,您需要确保您的工具链是“跨GCC”。虽然它是Linux上的默认设置,但不是MacOSX Lion上的默认设置。

为此,请转到“项目属性”>“ C / C ++构建”>“工具链编辑器”。“当前工具链”应设置为“跨GCC ”。您可能需要取消选中“仅显示兼容工具链”框”。

然后,向Android.mk中的LOCAL_CFLAGS添加一个选项:

LOCAL_CFLAGS := -std=gnu++11

现在,我们需要告知Eclipse在哪里可以找到相应的新符号(例如“ std :: unordered_map”)。转到右键单击“JNI”>属性> C / C ++常规- >路径和符号- >符号- > GNU C ++,并添加以下符号(通过单击“添加...”):

Name: __GXX_EXPERIMENTAL_CXX0X__
Value:

(即让“值”为空)


@yakk:通常需要2天才能通过。
moswald 2013年

我对此有一些问题。我使用Windows,并通过cmd进行编译。我在生成文件中添加了LOCAL_CFLAGS:= -D__GXX_EXPERIMENTAL_CXX0X__ -std = gnu ++ 11,但是当我运行ndk-build命令时,在使用unordered_map的位置出现错误(“ unordered_map”未命名类型)。代码可以在我的程序的linux和Windows端口中使用。任何想法可能有什么问题吗?我使用的NDK是最新的(今天已下载)。
SMGhost

3
如果您有多个模块,并且想要为所有文件启用该标志,则可以将该标志添加到Application.mk文件中的APP_CPPFLAGS变量中。
2013年

2
请参阅下面的答案,以获取有关现在标准化的C ++ 11 STL的最新版本。
scorpiodawg 2014年

STLport会发生什么?通过定义,它似乎是伪装为C ++ 11的C +库之一__cplusplus >= 201103L。STLport丢失<mutex><atomics>,等等
jww

7

如果使用gradle-experimental-plugin,也可以在build.gradle文件中进行设置:

android.ndk {
    moduleName = "hello-android-jni"
    stl = "stlport_shared"
    cppFlags.add("-std=c++11")
}

这是行不通的。它告诉我找不到cppFlags。
赛斯

嘿@Seth,很多事情都可能出错,您确定使用了正确版本的gradle插件和正确版本的gradle吗?如果您没有阅读过,这是一个很棒的行会。tools.android.com/tech-docs/new-build-system/...
雨辰忠

谢谢。但可悲的是,我已经阅读了那里的所有指南。大声笑。我只是用它pthread代替thread
赛斯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.