使用 Android Studio 使用本机代码编译 apk 时如何删除链接中的 libgnustl_static.a?

How remove libgnustl_static.a at linking when compiling apk with native code using Android Studio?

我正在使用 Android Studio (3.4.1) 构建一个包含 C++ 部分的 apk。编译阶段有效,link 阶段抛出错误。

错误:

clang++: error: no such file or directory: '/Users/homefolder/Library/Android/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/x86/libgnustl_static.a'

这来自完整 link 命令的最后一行:

/Users/homefolder/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23 --gcc-toolchain=/Users/homefolder/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64 --sysroot=/Users/homefolder/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -fno-addrsig -Wa,--noexecstack -Wformat -Werror=format-security -O2 -DNDEBUG -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Wl,-z,noexecstack -shared -Wl,-soname,libmy_lib.so -o ../../../../build/intermediates/cmake/release/obj/x86/libmy_lib.so CMakeFiles/my_lib.dir/src/main/cpp/my_lib.cpp.o -llog ../../../../libs/x86/libssl.a ../../../../libs/x86/libcrypto.a -latomic -lm "/Users/homefolder/Library/Android/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/x86/libgnustl_static.a"

确实这个库不存在于我的 sdk 文件夹中。文件夹 gnu-lib-stdc++ 不存在。

据我了解,本机代码是用CMake编译的。 CMake生成build.ninja个文件,执行ninja编译。如果我手动修改这些生成的 build.ninja 文件 以删除此库 然后在终端(在正确的文件夹中)调用 ninja ,然后它编译并 link 完美。

问题:

我应该在哪里修改 Android Studio 设置以使这些 build.ninja 文件不再包含此库?不想每次出apk都修改生成的文件

到目前为止我已经尝试过:

我找到的与CMake相关的唯一参数文件是CMakeList.txt。从文档 (1) 看来,这个库似乎可以使用 CMAKE_ANDROID_STL_TYPE 来设置。我已将其放入 CMakeList.txt 中的 'none''system',但我发现 build.ninja 文件没有区别。

# CMakeList.txt
set(CMAKE_ANDROID_STL_TYPE none)

配置:

经过 Tsyvarev 评论的进一步研究,我找到了解决方案:我手动修改了 .ExternalNativeBuild 文件夹中的所有 CMakeCache.txt 文件。

之前:

CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm "/Users/homefolder/Library/Android/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/libgnustl_static.a"

手动修复:

CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm

然后,auto-generated build.ninja 文件不再包含 link 到 libgnustl_static.a。然后 apk 编译。

此修复程序无法发送给我。我虽然 .ExternalNativeBuild 中的所有文件都是 auto-generated 并且在每次新构建时都被删除。名称本身包含 cache,因此听起来不像是用户应该修改的文件。然而,这是解决我的问题的有效方法。

我相信这些 CCMakeCaches.txt 文件是在第一次构建时生成的,然后 re-used 用于以下构建请求。这对我来说非常不合逻辑。我不明白为什么 set(CMAKE_ANDROID_STL_TYPE none) 不起作用。

And from documentation (1) , it seems like this library can be set up using CMAKE_ANDROID_STL_TYPE. I have put this to 'none' or 'system' in CMakeList.txt, but I see no difference in the build.ninja files.

# CMakeList.txt
set(CMAKE_ANDROID_STL_TYPE none)

错误的文档。你想要https://developer.android.com/ndk/guides/cmake。在 build.gradle 中设置以下值:

android {
  defaultConfig {
    externalNativeBuild {
      cmake {
        arguments "-DANDROID_STL=none",
      }
    }
  }
}