NDK r16b std::istringstream 的行为不符合预期

NDK r16b std::istringstream doesn't behave as expected

本文关键字:不符合 r16b std istringstream NDK      更新时间:2023-10-16

我有一个应用程序,它的原生代码是使用 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

任何人都可以告诉我为什么会发生这种情况?谢谢。

事实证明,我正在将libc ++_shared.so从NDK r12b复制到我的APK,这就是这种奇怪行为的原因。

这太愚蠢了,我的结论是案件结束了。