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

Android NDK链接第三方.so库出现绝对路径依赖问题求助

问题:第三方.so库链接时携带主机绝对路径导致加载失败

配置与报错情况

我在Android.mk中配置链接某厂商的.so库:

# main project
LOCAL_MODULE := mylib
LOCAL_SHARED_LIBRARIES += snpe_hta_hexagon_runtime
include $(BUILD_SHARED_LIBRARY)

# other lib
include $(CLEAR_VARS)
LOCAL_MODULE := snpe_hta_hexagon_runtime
LOCAL_SRC_FILES := $(SNPE_LIB_DIR)/libhta_hexagon_runtime_snpe.so
include $(PREBUILT_SHARED_LIBRARY)

随后在Java Activity中加载主库:

static {
      System.loadLibrary("mylib");
}

运行时出现加载错误:

java.lang.UnsatisfiedLinkError: dlopen failed: library 
"D:/work/test/project/android/build/intermediates/ndkBuild/debug/obj/local/arm64-v8a/libhta_hexagon_runtime_snpe.so" 
not found: needed by 
/data/app/~~4Z_rfVAZ7flNL6im3K2qWQ==/com.test.test-wrVtMvX-grcPp3fomXJSsQ==/lib/arm64/libmylib.so 
in namespace classloader-namespace 
at java.lang.Runtime.loadLibrary0(Runtime.java:1087)
at java.lang.Runtime.loadLibrary0(Runtime.java:1008)

其他同厂商库链接正常,唯独这个库被嵌入APK时,依赖记录里携带了主机机器的绝对路径。

问题原因

该厂商提供的libhta_hexagon_runtime_snpe.so缺少SONAME字段。正常情况下,.so库会通过SONAME(共享对象名称)标识自身,链接器在生成依赖时会使用这个SONAME;如果没有SONAME,链接器会直接将编译时库文件的本地绝对路径写入依赖信息,导致设备上无法找到对应路径的库文件。

解决方案

由于无法重新编译该厂商的库,可在编译Android项目前,使用patchelf工具直接修改库文件,添加SONAME:

patchelf --set-soname libmynewname.so <path_to_lib_file>

内容的提问来源于stack exchange,提问作者Alexey S. Larionov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 11:27:21