我正在尝试使用 cmake 构建我的 Android(本机)项目(从 gradle 实验插件迁移它,它以前可以正常构建和运行)。
我有一些本机代码(将其称为“a”),它使用另一个外部预构建库代码(将其称为“b”),我将两者链接起来,如下所示:
(根据https://developer.android.com/studio/projects/configure-cmake https://developer.android.com/studio/projects/configure-cmake)
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -frtti -fno-common -fexceptions")
include_directories(
#a's include files' paths
#b's include files' paths)
file(GLOB_RECURSE A_SOURCES
#a's source files' paths)
add_library(a_lib SHARED ${A_SOURCES})
add_library(b_lib SHARED IMPORTED)
set_target_properties(b_lib PROPERTIES IMPORTED_LOCATION "b's .so path")
target_link_libraries(a_lib b_lib)
我完成了编译和链接步骤,android studio 继续在我的设备上安装 APK。但是,启动后,应用程序冻结并在 logcat 中显示以下内容:
E/ExceptionHandler: Uncaught Exception java.lang.UnsatisfiedLinkError: dlopen failed: library "libb_lib.so" not found
at java.lang.Runtime.loadLibrary0(Runtime.java:989)
at java.lang.System.loadLibrary(System.java:1530)
at com.mm.projectname.model.libloadingclassname.<clinit>(libloadingclassname.java:99)
我知道发生这种情况是因为 apk 中不存在 b_lib 的 .so。我可以在 a 的共享库中看到 b 的符号以及 a 的符号。
所以我的问题是我怎样才能
- 将我预构建的 b 的 .so 打包到 apk 中
- 或者阻止系统在libs文件夹中查找b.so并使其仅在a的.so中查找b的符号。
我搜索了很多类似的帖子和问题(例如one https://stackoverflow.com/questions/47202483/using-a-prebuilt-shared-library-in-android-studio-cmake and two https://stackoverflow.com/questions/40162157/how-to-add-prebuilt-so-library-in-android-studio-2-2/40162932)但我无法让任何东西发挥作用。我真的在寻找正确的方法来做到这一点 - 这不会在将来产生问题(例如更改 targetSDK 版本)。我还尝试使用最新的 ndk 版本构建预构建的库。
我可能犯了一个很小的错误,如果有人能指出它,我将不胜感激。
提前致谢