我有一个应用程序,其本机代码是使用NDK r12b编译的。 但现在我想迁移到NDK r16b。
我使用独立工具链来编译我的应用程序(r12b和r16b)。 我用来制作工具链的论据是:
make_standalone_toolchain.py --arch arm --api 15 --stl libc++
使用r16b之后,我发现std :: istringstream不会拆分空格分隔的数字,如“0.4 0.5”。 istringstream的输出仍然是“0.4 0.6”而不是0.4和0.6。
另外,如果有减号( - ),它会分割输入,例如: “armeabi-v7a”将成为“armeabi”和“v7a”。 而当我使用r12b时,istringstream将不会拆分并输出“armeabi-v7a”。 我用这个片段来检查:
const char* input = " 0.4 0.5 "
std::istringstream iss(input);
__android_log_print(ANDROID_LOG_INFO, "myTag","istringstream input = %s", input);
for (std::istream_iterator<std::string> it = std::istream_iterator<std::string>(iss); it != std::istream_iterator<std::string>(); it++)
{
__android_log_print(ANDROID_LOG_INFO, "myTag", "istringstream content = %s", it->c_str() ? it->c_str() : "NULL");
}
我使用clang作为编译器,这些是我使用的命令行:
编译选项:
-fsigned-char
-fno-exceptions
-fno-rtti
-pipe
-ferror-limit=1000
-stdlib=libc++
-std=c++11
-D__ANDROID_API__=15
-mfpu=vfpv3-d16
-mfloat-abi=softfp
-target armv7a-none-linux-androideabi
-marm
-march=armv7-a
-mtune=generic-armv7-a
--sysroot $NDK_Root$/sysroot
-g
-O0
链接选项:
-lOpenSLES
-lGLESv2
-lEGL
-latomic
-landroid
-llog
-lm
-lz
-ldl
-lc++_shared
-lgcc
-lc
-Wl,--build-id
-target armv7a-none-linux-androideabi
-no-canonical-prefixes
-march=armv7-a
-Wl,--fix-cortex-a8
-Wl,-z,noexecstack
-Wl,--no-undefined
-Wl,-z,relro
-Wl,-z,now
-nostdlib
--sysroot $NDK_Root$/sysroot
任何人都可以告诉我为什么会发生这种情况?谢谢。
答案 0 :(得分:0)
事实证明,我正在将NDK r12b中的libc ++ _ shared.so复制到我的APK中,这就是造成这种奇怪行为的原因。
那是愚蠢的,我结束了案件结束。