引入预构建Native库后Android应用无法运行的问题解决
问题:预构建SO库在Android应用运行时出现路径错误
预构建库的Makefile配置
我有一个C编写的库,通过Android NDK的clang结合Makefile预构建,命令如下:
libfoo.so: $(CXX) -c -Wall -Werror -fpic ${SRC_PATH}foo.cpp $(CXX) -shared -o libfoo.so foo.o
输出库文件为libfoo.so。
Android项目的CMake配置
将该预构建库加入新的Android应用项目,CMakeLists.txt配置如下:
cmake_minimum_required(VERSION 3.22.1) project("myapplication6") set(library_pre_built_dir "${CMAKE_CURRENT_SOURCE_DIR}/../jniLibs") add_library(lib_foo SHARED IMPORTED) set_target_properties( lib_foo PROPERTIES IMPORTED_LOCATION ${library_pre_built_dir}/${ANDROID_ABI}/libfoo.so) add_library(${CMAKE_PROJECT_NAME} SHARED native-lib.cpp load_share_manual.cpp ) target_link_libraries(${CMAKE_PROJECT_NAME} android lib_foo log)
现象
项目构建成功,生成的APK中包含所有ABI对应的目标文件(x86、x86_64、armeabi-v7a、arm64-v8a目录下均存在libfoo.so),但运行时抛出错误:
E FATAL EXCEPTION: main Process: com.testapp.myapplication6, PID: 22331 java.lang.UnsatisfiedLinkError: dlopen failed: library "/home/minh/AndroidStudioProjects/MyApplication6/app/src/main/cpp/../jniLibs/x86_64/libfoo.so" not found
可见应用尝试加载主机PC上的本地路径,而非设备内的库文件路径。
解决方案
在预构建库的链接命令中添加-Wl,-soname参数,指定库的soname为libfoo.so。修改后的Makefile命令如下:
libfoo.so: $(CXX) -c -Wall -Werror -fpic ${SRC_PATH}foo.cpp $(CXX) -shared -Wl,-soname=libfoo.so -o libfoo.so foo.o
内容的提问来源于stack exchange,提问作者MinhNV
相关产品推荐
相关产品推荐

