You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

引入预构建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 08:28:23