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
相关产品推荐
相关产品推荐

