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

22
demandé sur Sergey K. 2013-07-30 19:11:38

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.
37
répondu Samveen 2013-08-08 12:59:33

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 .

7
répondu Mark S. 2015-12-29 00:40:52