Android NDK开发编译报错“std::***”的问题。

最近在做Android Studio做NDK开发,编译时出现了报错

Build command failed.

Error while executing process /Users/alpacaknight/Library/Android/sdk/cmake/3.6.4111459/bin/cmake with arguments {–build /Users/alpacaknight/AndroidStudioProjects/AICamera – CPU/app/.externalNativeBuild/cmake/debug/armeabi-v7a –target native-lib}

[1/1] Linking CXX shared library ../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/libnative-lib.so

FAILED: : && /Users/alpacaknight/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ –target=armv7-none-linux-androideabi –gcc-toolchain=/Users/alpacaknight/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64 –sysroot=/Users/alpacaknight/Library/Android/sdk/ndk-bundle/sysroot -fPIC -isystem /Users/alpacaknight/Library/Android/sdk/ndk-bundle/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=24 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,–noexecstack -Wformat -Werror=format-security -std=c++11 -frtti -fexceptions -std=c++11 -mfpu=neon-fp16 -mfloat-abi=softfp -O3 -O0 -fno-limit-debug-info -Wl,–exclude-libs,libgcc.a -Wl,–exclude-libs,libatomic.a -nostdlib++ –sysroot /Users/alpacaknight/Library/Android/sdk/ndk-bundle/platforms/android-24/arch-arm -Wl,–build-id -Wl,–warn-shared-textrel -Wl,–fatal-warnings -Wl,–fix-cortex-a8 -Wl,–exclude-libs,libunwind.a -L/Users/alpacaknight/Library/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a -Wl,–no-undefined -Wl,-

……

../../../../src/main/jniLibs/armeabi-v7a/libcaffe2.a(compiler.cc.o):compiler.cc:function std::_Sp_counted_ptr_inplace<std::string, std::allocator<std::string>,

……

根据日志可以知道,是编译C++的时候出现了报错,导致找不到生成的.so文件,查看日志发现了一个问题,日志里很多地方都提示“找不到函数std::***”,推测可能问题和std有关。

通过查找资料和询问技术大佬,最终找到了原因,我使用的NDK版本是Android Studio 3.1.4里通过SDK Manager安装的最新版,版本号是r17.0.4,问题就出现在这里了,r17使用了libc++作为默认代替了gnustl,而标准的GNU STL是由libstdc++提供的,本身虽然是GPL,但是只要不修改它的代码,就可以自由使用。但在Android平台上,因为很多适配上的问题,不经修改的libstdc++是无法直接使用的,所以NDK无法直接提供。

尝试更换r16b版本的NDK重新编译代码,编译通过。

问题总结:

NDK的兼容方向似乎有些奇怪,在做NDK开发时尽量不要选择过新版本的NDK,使用稳定版本是一个绝佳的选择。

 

发表评论