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

Android NDK二进制无法链接共享库,如何修改Android.mk修正路径问题

Android NDK可执行文件链接自定义共享库报错解决方案

问题现象

测试C(NDK二进制)-> Java -> C(共享库)的调用流程时,NDK编译出的可执行文件放到Android设备运行,linker报错找不到libjnitest.so:

08-27 10:29:16.416  1121  1121 F linker  : CANNOT LINK EXECUTABLE "/system/bin/JNI_output": library "./obj/local/arm64-v8a/libjnitest.so" not found

检查可执行文件的动态段信息,发现NEEDED字段中libjnitest.so被写入了本地编译的相对路径,而非纯库名,设置LD_LIBRARY_PATH也无法解决问题。

问题根源

提前使用aarch64-linux-gnu-gcc编译libjnitest.so时,没有指定soname,链接器在生成可执行文件时,会直接将预编译库的本地路径写入NEEDED段,而非库名。这种情况下linker会直接按写入的路径查找库,不会走LD_LIBRARY_PATH的搜索逻辑,所以设置环境变量无效。

修复方案

方案1:直接用NDK编译libjnitest.so(推荐)

修改Android.mk,删除原有jnitest的预编译配置,新增jnitest的编译模块,让NDK统一编译共享库和可执行文件,自动处理soname规则:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := jvm
LOCAL_SRC_FILES := $(SYSROOT)/home/juno/jdk1.8.0_301/jre/lib/aarch64/server/libjvm.so
include $(PREBUILT_SHARED_LIBRARY)

# 新增jnitest编译模块,替换原有预编译配置
include $(CLEAR_VARS)
LOCAL_MODULE := jnitest
LOCAL_SRC_FILES := jnitest.c
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := JNI_output
LOCAL_SRC_FILES := JNI_src.c
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
LOCAL_SHARED_LIBRARIES := jnitest jvm
include $(BUILD_EXECUTABLE)

方案2:给预编译的libjnitest.so添加soname

如果一定要提前用外部GCC编译共享库,编译时添加-Wl,-soname,libjnitest.so参数指定soname:

aarch64-linux-gnu-gcc -I/home/juno/jdk1.8.0_301/include -I/home/juno/jdk1.8.0_301/include/linux -o libjnitest.so jnitest.c -shared -fPIC -Wl,-soname,libjnitest.so

重新生成so后再用原有Android.mk编译可执行文件即可。

验证方法

修复后重新编译得到JNI_output可执行文件,执行readelf --all JNI_output查看动态段,确认NEEDED字段中libjnitest.so没有前置路径即可。

内容的提问来源于stack exchange,提问作者Hanseungkyun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:18:00