在 Android 上完成 C++11 支持

Complete C++11 support on Android

我目前正在尝试交叉编译我之前开发的跨平台库,以便在 Android 上使用它。 为此,我使用了 NDK 提供的 arm-linux-androideabi-g++ (4.9) 编译器,并且我 link NDK 中也存在 gnu-libstdc++。

遗憾的是,由于使用了某些 C++11 功能,编译不会成功。 这些功能是 "string.h" 中的特定方法,如 std::to_string 或 std::stof,如果需要,可以很容易地用其他方法替换。 但我也使用更复杂的,比如来自 "future.h" 的东西,例如 std::future 和 std::async.

我找到了 "string.h" 编译错误的原因,在文件 "ndk/sources/cxx-stl/gnu-libstdc++/4.9/bits/basic_string.h" 中,以下语句返回 false(_GLIBCXX_USE_C99 未定义):

 //basic_string.h 

 #if ((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \
     && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))

 //methods I want to use

 #endif

据我了解,这些限制是由 Android Bionic libc 引起的。

我有什么选择可以解决这个问题?

我已经尝试使用 CrystaX NDK,但它只能解决我的 "string.h" 问题,我宁愿找到更标准的解决方案。

使用不特定于 Android 的 ARM 交叉编译器怎么样?

谢谢。

我终于找到了解决这个问题的方法。

首先,"future.h" 方法的使用完全由 android NDK 提供的 gnu-libstdc++ 支持,我只是错过了一些允许使用它的包含,我的错。

接下来,我深入研究了我的库,发现真正导致编译错误的唯一方法是 std::to_string。 所以我决定用以下内容简单地覆盖它:

#if __ANDROID__

namespace std {
  #ifndef to_string
  inline string to_string(int _Val)
  {    // convert int to string
      char _Buf[256];
      sprintf(_Buf, "%d", _Val);
      return (string(_Buf));
  }
  #endif
}

#endif

我想如果有一些其他不受支持的 C++11 方法,也可以覆盖它们。