使用 Android Studio 使用本机代码编译 apk 时,如何在链接处删除 libgnustl_static.



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

错误 :

clang++: 错误: 没有这样的文件或目录: '/Users/homefolder/Library/Android/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/x86/libgnustl_static.a'

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

/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,那么它会完美编译和链接。

问题 :

我应该在哪里修改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)

配置:

  • 安卓工作室 3.4.1
  • 安卓 SDK 工具 26.1.1
  • CMake 3.10.2(不确定, 还安装了 3.6)
  • macOS 10.14

从文档 (1) 来看,似乎可以使用CMAKE_ANDROID_STL_TYPE来设置这个库。我在CMakeList.txt中将其设置为"none"或"system",但是我认为build.ninja文件中没有区别。

# 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",
}
}
}
}

由于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

然后,自动生成的 build.ninja 文件不再包含指向 libgnustl_static.a 的链接。然后 apk 编译。

此修复程序不会发送给我。我认为.ExternalNativeBuild中的所有文件都是在每次新版本时自动生成和擦除的。名称本身包含cache,因此听起来不像用户应该修改的文件。然而,这是我问题的工作解决方案。

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

最新更新