Intereting Posts
Как установить прозрачный фон для кнопки изображения в коде? Преобразование даты и времени в миллисекунды в Android Как установить голографическую темную тему в приложении для Android? Может ли Android поддерживать Zeroconf / Bonjour через Bluetooth? Как насчет TCP / IP? Android – соглашение об именах пакетов Нарисовать круг на Android MapView Класс мест удален из игровых сервисов android 9.2.0 Android ndk: проблема для вызова метода Java из c ++ с jni Может ли Android WebView автоматически изменять размеры огромных изображений? Есть ли пример использования TouchDelegate в Android для увеличения размера цели клика? Пользовательский прозрачный Android ActionBar Как обрабатывать RESTful обновление удаленного сервера с помощью SyncAdapter Точность акселерометра Android (инерциальная навигация) JSONObject.toString: как НЕ удалять косые черты Android – Является ли намерение сохраненным во время активного отдыха?

Как использовать std :: stoul и std :: stoull в Android?

C ++ 11 имеет две новые функции преобразования строк в unsigned long и long long : std::stoul() и std::stoll() .

Недавний Android NDK r9 представляет компилятор Clang 3.3, который, как говорят, является дополнением C ++ 11. Есть прототипы для этих функций глубоко внутри NDK, но я не могу их использовать.

Что мне нужно сделать, чтобы использовать их?

PS Я уже делаю LOCAL_CPPFLAGS += -std=c++11

Solutions Collecting From Web of "Как использовать std :: stoul и std :: stoull в Android?"

Причина, по которой вы не можете использовать функции, довольно глубоко укоренена и, к сожалению, в настоящее время неразрешима.

Заглядывая в libs/armeabi-v7a/include/bits/c++config.h config.h в папке gnu stdlibc ++, вы увидите следующее:

 ... /* 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 */ ... 

Вышеприведенное в сочетании со следующим фрагментом из 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 ... 

Таким образом, эти функции непригодны для использования в NDK.

Корневая причина . Коренной причиной является то, что использование функции C99 отключено в GNU stdlibc ++ на платформе armeabi-v7a из-за того, что Bionic libc не поддерживает сложную математику (стандартная библиотека C на Android – Bionic) ,

Возможное исправление (непроверено): Исследуйте Android NDK от CrystaX, который, похоже, имеет расширения над Vanilla Android NDK.

Примечание: __GXX_EXPERIMENTAL_CXX0X__ определяется добавлением -std=gnu++11 в APP_CXXFLAGS или LOCAL_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 <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); } 

Выход на 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

To Application.mk исправил мою проблему неспособности доступа к std :: stoi () (используя gcc 4.8.4).

Решение от Daniel Tavares, из этой публикации в Google Groups .