swa*_*log 24 c++ android stl android-ndk
tl; dr:这个问题是为了解释为什么std::stringstream"失败",以及为什么它在链接到重建的c ++ _共享库时失败的方式(通过简单地什么都不做).
一个最小的例子:
std::stringstream ss;
ss << "Hello World";
__android_log_print(ANDROID_LOG_INFO,
"APP",
"Length: %i", ss.str().size());
Run Code Online (Sandbox Code Playgroud)
使用时编译项目
APP_STL := c++_shared
LIBCXX_FORCE_REBUILD := true
Run Code Online (Sandbox Code Playgroud)
输出是Length: 0.当使用APP_STL := c++_static或LIBCXX_FORCE_REBUILD := false,stringstream按预期工作时,Length: 11作为输出.
我正在使用STL的很多部分,到目前为止我看到的唯一明显的区别是这个沉默NOP stringstream.我还通过修改libgl2jniNDK示例测试了这一点,将Application.mk文件添加为:
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
Run Code Online (Sandbox Code Playgroud)
我已经测试了APP_OPTIM作为发布/调试的各种排列,APP_STL如c ++ _ shared/c ++ _ static,以及LIBCXX_FORCE_REBUILD在Nexus-4上的true/false,armeabi以及armeabi-v7a作为目标ABI.这是结果:
|-------------+-----------+----------------------+---------+------------------|
| 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 |
|-------------+-----------+----------------------+---------+------------------|
Run Code Online (Sandbox Code Playgroud)
[1]/opt/android-ndk-r9d/sources/cxx-stl/llvm-libc ++/libs/armeabi/libc ++ static.a(ios.o):/ tmp/ndk-andrewhsieh/tmp/build-21097/build -libc ++/ndk/sources/cxx-stl/llvm-libc ++/libcxx/src/ios.cpp:function std :: _1 :: ios_base :: xalloc():error:未定义引用'__atomic_fetch_add_4'
PS:确保ndk-build clean在这些测试之间进行.
问题:
任何人都可以std::stringstream根据这些情况给出一些有关失败原因的信息,以及为什么只通过对流向它的任何数据执行NOP而失败?
谢谢
小智 22
我无法回答为什么NOP在一些排列中发生.但我确实设法找出了构建失败的原因.
我的情况比你糟糕.我遇到了与使用c ++ _ static和LIBCXX_FORCE_REBUILD(false)的默认值相关的构建失败,并且不知道为什么.
感谢您将您的研究分享到链接STL的各种排列 - 我能够直接跳到显着的文档来修复构建错误.
如果你#include,你可能需要libatomic.为ndk-build添加"LOCAL_LDLIBS + = -latomic"
为了能够使用libatomic,您需要将NDK_TOOLCHAIN_VERSION设置为4.8