2013-07-30 12 views
20

C++ 11 ma dwie nowe funkcje konwersji ciągów w unsigned long i long long: std::stoul() i std::stoll().Jak używać std :: stoul i std :: stoull w systemie Android?

Niedawny Android NDK r9 wprowadza kompilator Clang 3.3, który ma pełnić funkcję C++ 11. Istnieją prototypy tych funkcji głęboko w NDK, jednak nie mogę ich używać.

Co należy zrobić, aby z nich korzystać?

P.S. Mam już LOCAL_CPPFLAGS += -std=c++11

+3

Prawdopodobnie podobne do tego http://stackoverflow.com/questions/15616254/enable-c11-support-onandroid. ale zamiast tego używaj biblioteki C++ 11. (Myślę, że jego '-stdlib = libC++ -std = C++ 11' dla LOCAL_CFLAGS) – FDinoff

+0

Już robię' '-std = C++ 11'' –

+0

' -stdlib = libC++ 'jest również potrzebny, spróbuj it – aaronman

Odpowiedz

36

Powód, dla którego nie można korzystać z funkcji, jest dość głęboko zakorzeniony i niestety obecnie nierozwiązywalny.

Patrząc w pliku w gnu stdlibc libs/armeabi-v7a/include/bits/c++config.h ++ folderu, zobaczysz to:

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

Powyższe, w połączeniu z następującym fragmencie od bits/basic_string.h czarów bad news:

... 
#if (defined(__GXX_EXPERIMENTAL_CXX0X__) && defined(_GLIBCXX_USE_C99) \ 
    && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF)) 

/* The definitions of Numeric Conversions [string.conversions] */ 
#endif 
... 

W związku z tym funkcje te nie nadają się do użytku w NDK.

głównej Przyczyna: Przyczyną wydaje się być to, że korzystanie z funkcji C99 zostało wyłączone w stdlibc GNU ++ na platformie armeabi-v7a ze względu na fakt, The Bionic libc nie obsługuje skomplikowany matematyki (średnia C biblioteka na Androida to Bionic).

Możliwa Fix (niesprawdzone): Przeglądaj CrystaX's Android NDK który wydaje się mieć rozszerzenia nad Vanilla Android NDK.

Uwaga:__GXX_EXPERIMENTAL_CXX0X__ jest określony przez dodanie -std=gnu++11 do APP_CXXFLAGS lub LOCAL_CXXFLAGS

szczegółowy dziennik Test: zbudowany przy użyciu wersji NDK R 8e
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); 
} 

wyjściowa Nexus na 4 (Mobile 4,3)

[email protected]:/ $ /data/local/tmp/cxx11 
__GXX_EXPERIMENTAL_CXX0X__ defined. 
_GLIBCXX_USE_C99 not defined. 
_GLIBCXX_HAVE_BROKEN_VSWPRINTF not defined. 
No support for stoll/stoul. 
+0

Dowolna szansa na zastąpienie stdlib? –

+0

@SergeyK. Wypróbuj [CrystaX's Android NDK] (http://www.crystax.net/android/ndk.php), który wydaje się mieć pewne poprawki w NDK Vanilla Android. Chciałbym również je zbadać. – Samveen

+0

Czy próbowałeś NDK r9? Może możemy zdefiniować _GLIBCXX_USE_C99 ręcznie? –

5

dodania:

APP_STL: = C++ _static

do Aplikacja.mk naprawiła mój problem polegający na niemożności uzyskania dostępu do std :: stoi() (używając gcc 4.8.4).

rozwiązanie za pośrednictwem Daniela Tavaresa, z tego Google Groups post.

+0

Czy to również rozwiązało problem dostępu do funkcji 'unsigned long' i' long long' funkcji ('stoul' i' stoll')? – Samveen

+0

To rozwiązanie pomogło mi w stoul(). Dzięki. – Stranger

Powiązane problemy