如何在Android中使用std :: stoul和std :: stoull?

C ++ 11有两个新的字符串转换函数为unsigned longlong longstd::stoul()std::stoll()

最近的Android NDK r9引入了Clang 3.3编译器,据称它是完整的C ++ 11function。 NDK内部有这些函数的原型,但是我不能使用它们。

使用它们需要做什么?

PS我已经做了LOCAL_CPPFLAGS += -std=c++11

Solutions Collecting From Web of "如何在Android中使用std :: stoul和std :: stoull?"

你不能使用这些function的原因是根深蒂固的,不幸的是目前无法解决。

查看gnu stdlibc ++文件夹中的libs/armeabi-v7a/include/bits/c++config.h文件,您将看到:

 ... /* Define if C99 functions or macros from , , , , and  can be used or exposed. */ /* #undef _GLIBCXX_USE_C99 */ ... 

以上,结合来自bits/basic_string.h的以下片段拼写了坏消息:

 ... #if (defined(__GXX_EXPERIMENTAL_CXX0X__) && defined(_GLIBCXX_USE_C99) \ && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF)) /* The definitions of Numeric Conversions [string.conversions] */ #endif ... 

因此,这些function在NDK中是不可用的。

根本原因:根本原因似乎是在armeabi-v7a平台上的GNU stdlibc ++中禁用了C99function使用,因为Bionic libc不支持复杂的数学运算(Android上的标准C库是Bionic) 。

可能的修复(未经测试):探索CrystaX的Android NDK ,它似乎比Vanilla Android NDK有扩展。

注意: __GXX_EXPERIMENTAL_CXX0X__是通过将-std=gnu++11添加到APP_CXXFLAGSLOCAL_CXXFLAGSLOCAL_CXXFLAGS

详细测试日志:使用NDK版本r8e构建
jni / Application.mk

 APP_STL := gnustl_static APP_CXXFLAGS += -std=gnu++11 NDK_TOOLCHAIN_VERSION := 4.7 

JNI / Android.mk

 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := cxx11 LOCAL_SRC_FILES := cxx11.cpp include $(BUILD_EXECUTABLE) 

jni / cxx11.cpp

 #include  #include  int main(int argc, char* argv[]) { #if defined(__GXX_EXPERIMENTAL_CXX0X__) std::cout< <"__GXX_EXPERIMENTAL_CXX0X__ defined."< 

Nexus 4(Android 4.3)上的输出:

 u0_a51@mako:/ $ /data/local/tmp/cxx11 __GXX_EXPERIMENTAL_CXX0X__ defined. _GLIBCXX_USE_C99 not defined. _GLIBCXX_HAVE_BROKEN_VSWPRINTF not defined. No support for stoll/stoul. 

添加:

APP_STL:= c ++ _ static

到Application.mk解决了我无法访问std :: stoi()的问题(使用gcc 4.8.4)。

来自Google网上论坛post的 Daniel Tavares解决方案。