tl; dr: La domanda è per una spiegazione del perché std::stringstream
"fallisce", e perché non riesce nel modo in cui lo fa (per semplicemente non facendo nulla), quando si collega a una libreria condivisa C++ _ ricostruita.NDK Android STL C++ _ condivisa w/risultati LIBCXX_FORCE_REBUILD in std :: stringstream NOP
Un esempio minimo:
std::stringstream ss;
ss << "Hello World";
__android_log_print(ANDROID_LOG_INFO,
"APP",
"Length: %i", ss.str().size());
Quando si compila il progetto con
APP_STL := c++_shared
LIBCXX_FORCE_REBUILD := true
L'uscita è Length: 0
. Quando si utilizza APP_STL := c++_static
o LIBCXX_FORCE_REBUILD := false
, le stringstream
opere come previsto, con Length: 11
come uscita.
Sto utilizzando molte parti dell'STL e l'unica differenza evidente che ho visto finora è questa silenziosa NOP
stringstream
. Ho anche provato questo modificando il campione libgl2jni
NDK, aggiungendo il file Application.mk come:
NDK_TOOLCHAIN_VERSION := 4.8
APP_OPTIM := release
APP_STL := c++_shared
APP_ABI := armeabi-v7a #armeabi-v7a x86
APP_PLATFORM := android-19
LIBCXX_FORCE_REBUILD := true
Ho provato le varie permutazioni di APP_OPTIM
come rilascio/debug, APP_STL
come C++ _ condiviso/C++ _ statica e LIBCXX_FORCE_REBUILD
come vero/falso, su un Nexus-4, sia con armeabi
e armeabi-v7a
come bersaglio ABI
. Questo è il risultato:
|-------------+-----------+----------------------+---------+------------------|
| ABI | stl c++_? | LIBCXX_FORCE_REBUILD | optim | Result |
|-------------+-----------+----------------------+---------+------------------|
| armeabi | static | true | release | OK |
| | static | true | debug | OK |
| | static | false | release | BUILD FAILED [1] |
| | static | false | debug | BUILD FAILED [1] |
| | shared | true | release | NOP |
| | shared | true | debug | NOP |
| | shared | false | release | OK |
| | shared | false | debug | OK |
|-------------+-----------+----------------------+---------+------------------|
| armeabi-v7a | static | true | release | OK |
| | static | true | debug | OK |
| | static | false | release | OK |
| | static | false | debug | OK |
| | shared | true | release | NOP |
| | shared | true | debug | NOP |
| | shared | false | release | OK |
| | shared | false | debug | OK |
|-------------+-----------+----------------------+---------+------------------|
[1]/opt/android-NDK-r9d/sorgenti/CXX-stl/LLVM-libC++/librerie/armeabi/libC++ static.a (ios.o):/tmp/NDK-andrewhsieh/tmp/build-21097/build-libC++/NDK/sorgenti/CXX-stl/LLVM-libC++/libcxx/src/ios.cpp: la funzione std :: _1 :: :: ios_base xalloc() : errore: undefined reference to '__atomic_fetch_add_4'
PS: assicurarsi di fare un ndk-build clean
tra questi test.
La domanda: Qualcuno potrebbe dare una certa comprensione sul perché std::stringstream
fallisce Date queste circostanze, e perché non riesce da solo facendo un NOP su tutti i dati che viene trasmesso ad esso?
Grazie
stavo avendo un problema simile e aggiungendo che lib ha fatto il trucco per me :) – unbekant
carico libatomic aiutato per la costruzione di target armeabi – Sam
Strano, ma dopo alcune difficoltà ho potuto compilare solo dopo aver aggiunto 'APP_LDFLAGS + = -latomic' LDLIBS non ha funzionato per me. –