Android ndk std :: to_string support

Estoy usando android NDK r9d y toolchain 4.8 pero no puedo usar la función std :: to_string, el comstackdor arroja este error:

error: 'to_string' is not a member of 'std' 

¿Esta función no es compatible con Android ndk? Intento APP_CPPFLAGS := -std=c++11 sin suerte.

Puede intentar LOCAL_CFLAGS := -std=c++11 , pero tenga en cuenta que no todas las API de C ++ 11 están disponibles con el gnustl del NDK . El soporte completo de C ++ 14 está disponible con libc ++ ( APP_STL := c++_shared ).

La alternativa es implementarlo usted mismo.

 #include  #include  template  std::string to_string(T value) { std::ostringstream os ; os << value ; return os.str() ; } int main() { std::string perfect = to_string(5) ; } 

Con NDK r9 + puedes usar llvm-libc ++ que ofrece soporte completo para cpp11.

En su Application.mk , debe agregar:

 APP_STL:=c++_static 

o

 APP_STL:=c++_shared 

Gradle

Si busca una solución para el sistema de comstackción Gradle. Mire esta respuesta .

Respuesta corta.

Agrega la cadena

 arguments "-DANDROID_STL=c++_shared" 

en tu build.gradle Me gusta

 android { ... defaultConfig { ... externalNativeBuild { cmake { ... arguments "-DANDROID_STL=c++_shared" } } } ... } 

Complemento Gradle Experimental

Si está buscando una solución para el plugin Experimental Gradle, esto funcionó para mí …

Probado con com.android.tools.build:gradle-experimental:0.9.1

 model { ... android { ... ndk { ... stl = "c++_shared" } } } 

No pude usar c++_static , me dio algunos errores sobre excepciones indefinidas. Así que volví al gnustl_static .

Pero en fonts NDK, en sources/cxx-stl/llvm-libc++/src/string.cpp , encontré la implementación de to_string(int) e intenté copiarlo en mi código. Después de algunas correcciones, funcionó.

Entonces la última pieza de código que tenía:

 #include  #include  using namespace std; template inline S as_string(P sprintf_like, S s, const typename S::value_type* fmt, V a) { typedef typename S::size_type size_type; size_type available = s.size(); while (true) { int status = sprintf_like(&s[0], available + 1, fmt, a); if ( status >= 0 ) { size_type used = static_cast(status); if ( used <= available ) { s.resize( used ); break; } available = used; // Assume this is advice of how much space we need. } else available = available * 2 + 1; s.resize(available); } return s; } template ::value> struct initial_string; template  struct initial_string { string operator()() const { string s; s.resize(s.capacity()); return s; } }; template  struct initial_string { wstring operator()() const { const size_t n = (numeric_limits::digits / 3) + ((numeric_limits::digits % 3) != 0) + 1; wstring s(n, wchar_t()); s.resize(s.capacity()); return s; } }; template  struct initial_string { wstring operator()() const { wstring s(20, wchar_t()); s.resize(s.capacity()); return s; } }; string to_string(int val) { return as_string(snprintf, initial_string()(), "%d", val); } 

Para Android Studio, agregue esto en build.gradle (aplicación móvil)

 externalNativeBuild { cmake { cppFlags "-std=c++11" arguments "-DANDROID_STL=c++_static" } }