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

为何Android NDK的System.loadLibrary会尝试加载SONAME库libQnnHta.so?

问题原因

你遇到的问题根源在于动态链接库的SONAME机制:libSnpeHta.so的内部SONAME被设置为libQnnHta.so,当系统加载依赖它的mylib时,会根据这个SONAME去寻找对应的库文件,而非你提供的libSnpeHta.so文件名,因此才会报找不到libQnnHta.so的错误。

解决方法

以下是几种可行的解决思路:

方法1:复制并重命名库文件

直接将libSnpeHta.so复制一份并命名为libQnnHta.so,确保系统能匹配到SONAME对应的文件。修改你的Android.mk,取消注释并调整shell命令:

...
# dependency
include $(CLEAR_VARS)
LOCAL_MODULE := snpe_hta
LOCAL_SRC_FILES := $(SNPE_LIB_DIR)/libSnpeHta.so
# 复制库并重命名为SONAME指定的名称
$(shell cp $(LOCAL_SRC_FILES) $(TARGET_OUT)/libQnnHta.so)
include $(PREBUILT_SHARED_LIBRARY)
...

打包后系统目录下会同时存在libSnpeHta.so和libQnnHta.so,加载器就能找到匹配SONAME的文件。

方法2:修改库的SONAME(推荐)

使用patchelf工具修改libSnpeHta.so的SONAME,让它与文件名保持一致:

patchelf --set-soname libSnpeHta.so /path/to/libSnpeHta.so

修改完成后重新编译打包,加载器会直接寻找libSnpeHta.so,无需额外处理文件名称。

方法3:新增预构建库模块

在Android.mk中新增一个针对libQnnHta.so的预构建模块,指向原libSnpeHta.so文件:

...
# main project
LOCAL_MODULE := mylib
LOCAL_SHARED_LIBRARIES += snpe_hta qnn_hta
include $(BUILD_SHARED_LIBRARY)
...
# dependency: snpe_hta
include $(CLEAR_VARS)
LOCAL_MODULE := snpe_hta
LOCAL_SRC_FILES := $(SNPE_LIB_DIR)/libSnpeHta.so
include $(PREBUILT_SHARED_LIBRARY)
# dependency: qnn_hta(对应SONAME)
include $(CLEAR_VARS)
LOCAL_MODULE := qnn_hta
LOCAL_SRC_FILES := $(SNPE_LIB_DIR)/libSnpeHta.so
LOCAL_MODULE_FILENAME := libQnnHta.so
include $(PREBUILT_SHARED_LIBRARY)
...

通过LOCAL_MODULE_FILENAME指定打包后的文件名,系统会生成符合SONAME要求的libQnnHta.so文件。

内容的提问来源于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 09:17:02