Android 设置C++;11(std::thread)用于带有ADT/Eclipse的NDK

Android 设置C++;11(std::thread)用于带有ADT/Eclipse的NDK,android,eclipse,c++11,android-ndk,java-native-interface,Android,Eclipse,C++11,Android Ndk,Java Native Interface,我一直在尝试使用C++11。我正在开发一个android项目,我想使用std::mutex。连同OpenCV 但无论我做什么,我似乎都无法修复无法解析的类型“mutex” 错误 我试着按照我在某地和其他地方找到的教程进行学习。 ADT v22.3.0-887826 已安装的C/C++编译器(CDT) 经过这么多的教程,现在真是一团糟。因此,我将解释我当前的设置 项目>属性>C/C++构建>工具链编辑器 当前工具链为“交叉GCC” 当前生成器为“Android Builder” 项目>属性

我一直在尝试使用C++11。我正在开发一个android项目,我想使用std::mutex。连同OpenCV 但无论我做什么,我似乎都无法修复无法解析的
类型“mutex”
错误

我试着按照我在某地和其他地方找到的教程进行学习。

  • ADT v22.3.0-887826
  • 已安装的C/C++编译器(CDT)
  • 经过这么多的教程,现在真是一团糟。因此,我将解释我当前的设置

    • 项目>属性>C/C++构建>工具链编辑器
      • 当前工具链为“交叉GCC”
      • 当前生成器为“Android Builder”
    • 项目>属性>C/C++生成>发现选项

      • 编译器调用命令为“gcc”
      • 编译器调用参数是-E-P-v-dD“${plugin\u state\u location}/specs.c-std=c++11”
    • 项目>C/C++常规>路径和符号>#符号选项卡

      • 符号=uu cplusplus和值=1
    在Application.mk文件中,我有以下内容

    APP_STL := gnustl_static
    APP_USE_CPP0X := true
    APP_CPPFLAGS := -std=c++11 -frtti -fexceptions
    APP_ABI := armeabi-v7a
    APP_PLATFORM := android-8
    
    我试图将cplusplus符号的值更改为201103L 并使用空值尝试了uuugxx_uxx0x

    但似乎什么都不管用,我做错了什么


    感谢您的帮助

    std::thread
    的支持有点特殊。例如,这一问题在本报告中得到了解决。这篇文章很短,但可以用一句话来概括:

    如果希望
    #include
    #include
    ,则不能使用(默认)gcc 4.6工具链

    因此,请将
    NDK\u TOOLCHAIN\u VERSION=4.8
    NDK\u TOOLCHAIN\u VERSION=clang
    添加到您的
    应用程序.mk


    要使ADT正确重建其索引,请参阅Android.mk中的或。添加
    本地\CPPFLAGS:=-std=c++11-D\uu cplusplus=201103L
    ,然后重建项目(用于重新配置编译器)。重建后,如果升级NDK或安装新版本的Android Studio(编写时为2.1),项目会自动将所需的stl路径添加到路径和符号中让Android Studio为您下载NDK,您将获得第12版-其中有许多未在\NDK bundle\sources\cxx stl\gnu libstdc++\4.9\libs\armeabi-v7a\include\bits\c++config.h中定义的std::defines-与线程相关的版本,例如“GLIBCXX”中有隐藏线程类的GTHREADS

    它说,在第10e版之后,gcc被弃用。有了这些,前面提到的所有定义都彻底破坏了依赖于线程的JNI代码

    其他帖子中提到的叮当声对我们来说不是一个解决方案,因为它似乎不支持thead_local。 解决方案是恢复到10e版-您可以在以下网址找到:

    dl.google.com/android/ndk


    解压包并复制到sdk/ndk捆绑包目录中-确保先删除最初的修订版12。

    问题仅仅是Eclipse强调的错误,还是您的构建也失败了?Eclipse在C++11.0中有缺陷。的可能重复。无论哪种方式,您都不需要CDT;但是你必须安装NDK。我不认为“
    \ucplusplus
    和Value=1”是正确的;我认为C++11的值应该至少为
    201103L
    。但是我认为你真的不应该弄乱这个值。现在,“但似乎什么都不起作用”是什么意思?简而言之,请回答Steve的问题。还有一件事:?您使用的GCC的实际版本是什么?如果
    \uu cplusplus
    ==1,那么它的版本很可能太旧了。那么从教程中我看到的cxx stt/4.6之类的“包含”源代码呢。这是否意味着我也必须更改包含源?可能是的,只有这样你的答案才会起作用,对吗?对于索引器的问题,可能有不同的解决方法。也许你的方法也很好。是的,我有!终于成功了!老兄,这太难缠了。我不得不重新启动eclipse,这花了我3个小时才弄明白:)但一切都在运行。截至2018-15-01,与Binglong文章的链接指向一堵墙,表明所讨论的文章是私人的,因此几乎所有没有获得该文章作者特权的人都无法访问。@Adrien,谢谢你让我知道。无论如何,我确实发布了那篇文章的摘要。请注意,这与当前的NDKR16无关:当前的NDKR16支持C++11甚至C++17,但gcc工具链将在下一版本中消失。而且,eclipse已经被弃用多年了。根据NDK bugtracker,这个问题已经被修复