我正在尝试使用cmake构建我的Android(原生)项目(将其从gradle实验性插件迁移,以前可以成功地构建和运行)。
我有一些本地代码(将其称为'a'),它使用另一个外部预构建库代码(将其称为'b'),我像这样链接了这两个: (根据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)
我通过编译和链接步骤,安卓工作室继续在我的设备上安装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的符号。
我搜索了很多类似的帖子和问题(例如一个和两个),但我什么都做不好。我真的在寻找正确的方法-不会在未来创建问题(例如更改targetSDKversion)。我还尝试使用最新的ndk版本构建预构建库。
有可能我犯了一个非常小的错误,如果有人能指出来,我会非常感激。
提前感谢
fileTree(dir: 'libs', include: '**/*.so')
。compile fileTree(dir: 'libs', include: ['.jar','.so'])
。 - Akhila