Comment utiliser std::stoul et std::stoull dans Android?
C++11 a deux nouvelles fonctions de conversion de chaîne en unsigned long
et long long
: std::stoul()
et std::stoll()
.
le récent Android NDK r9 introduit Clang 3.3 compilateur qui est dit être c++11 fonctionnalité complète. Il y a des prototypes pour ces fonctions profondément à L'intérieur de NDK, mais je ne peux pas les utiliser.
Que dois-je faire pour les utiliser?
P. S. je fais déjà LOCAL_CPPFLAGS += -std=c++11
2 réponses
la raison pour laquelle vous ne pouvez pas utiliser les fonctions est très enracinée, et malheureusement actuellement insoluble.
en regardant le fichier libs/armeabi-v7a/include/bits/c++config.h
dans le dossier gnu stdlibc++, vous verrez ceci:
...
/* Define if C99 functions or macros from <wchar.h>, <math.h>, <complex.h>,
<stdio.h>, and <stdlib.h> can be used or exposed. */
/* #undef _GLIBCXX_USE_C99 */
...
ce qui précède, en conjonction avec l'extrait suivant de bits/basic_string.h
signifie mauvaises nouvelles:
...
#if (defined(__GXX_EXPERIMENTAL_CXX0X__) && defined(_GLIBCXX_USE_C99) \
&& !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))
/* The definitions of Numeric Conversions [string.conversions] */
#endif
...
ces fonctions sont donc inutilisables dans le NDK.
cause racine: la cause racine semble être que l'utilisation de la fonctionnalité C99 a été désactivée dans le GNU stdlibc++ sur la plate-forme armeabi-v7a en raison du fait que la libc bionique ne supporte pas les mathématiques complexes (la bibliothèque C standard sur Android est Bionic).
Correction Possible (non testé): Explorer CrystaX Android NDK qui semble avoir des extensions de plus de la Vanille Android NDK.
Note: __GXX_EXPERIMENTAL_CXX0X__
est défini par l'ajout de -std=gnu++11
à APP_CXXFLAGS
ou LOCAL_CXXFLAGS
journal détaillé des essais: Construit en utilisant la version 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 <iostream>
#include <string>
int main(int argc, char* argv[]) {
#if defined(__GXX_EXPERIMENTAL_CXX0X__)
std::cout<<"__GXX_EXPERIMENTAL_CXX0X__ defined."<<std::endl;
#else
std::cout<<"__GXX_EXPERIMENTAL_CXX0X__ not defined."<<std::endl;
#endif
#if defined(_GLIBCXX_USE_C99)
std::cout<<"_GLIBCXX_USE_C99 defined."<<std::endl;
#else
std::cout<<"_GLIBCXX_USE_C99 not defined."<<std::endl;
#endif
#if defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF)
std::cout<<"_GLIBCXX_HAVE_BROKEN_VSWPRINTF defined."<<std::endl;
#else
std::cout<<"_GLIBCXX_HAVE_BROKEN_VSWPRINTF not defined."<<std::endl;
#endif
#if (defined(__GXX_EXPERIMENTAL_CXX0X__) && defined(_GLIBCXX_USE_C99) \
&& !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))
std::string s="1";
std::cout<<"ll:"<<std::stoll(s)<<std::endl<<"ul:"<<std::stoul(s)<<std::endl;
#else
std::cout<<"No support for stoll/stoul."<<std::endl;
#endif
return(0);
}
sortie sur 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.
ajouter:
APP_STL: = c++_static
to Application.mk a corrigé mon problème de ne pas pouvoir accéder à std::stoi() (en utilisant gcc 4.8.4).
solution via Daniel Tavares, de ce Google Groups post .