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

Android NDK链接预构建共享库遇libc.so.6未找到错误求助

解决JNI链接时libc.so.6找不到的问题

嘿,这个问题我之前碰过好多次,本质上是预构建的libdivsufsort库和你当前的JNI运行环境(大概率是Android,桌面Java一般不会缺libc)不兼容导致的。咱们一步步拆解解决:

问题根源

你用的libdivsufsort应该是基于桌面Linux环境编译的,它链接了桌面版的C标准库libc.so.6,但Android系统用的是Bionic C库,系统里只有libc.so,没有libc.so.6这个文件名,所以dlopen的时候就报错找不到了。

解决方案

1. 优先选择:重新交叉编译libdivsufsort到目标平台

这是最稳妥的方案,确保库和你的JNI环境完全匹配:

  • 拿Android举例,用NDK的交叉编译工具链来编译:
    1. 下载对应版本的Android NDK,找到工具链路径(比如${NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin)
    2. 针对你的目标架构(arm64-v8a、armeabi-v7a等)调用编译器,比如编译arm64的命令:
      ${NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang -shared -fPIC -o libdivsufsort.so divsufsort.c divsufsort_utils.c
      
    3. 编译完成后,用readelf -d libdivsufsort.so | grep NEEDED检查依赖,应该会看到libc.so而不是libc.so.6。

2. 应急方案:修改预构建库的依赖(有风险)

如果暂时没法重新编译,可以用patchelf工具修改库的依赖项,把libc.so.6替换成libc.so:

  • 安装patchelf(比如Ubuntu上sudo apt install patchelf)
  • 执行命令:
    patchelf --replace-needed libc.so.6 libc.so libdivsufsort.so
    
  • 注意:这个方法只是改了依赖文件名,桌面libc和Android Bionic的API可能有差异,运行时可能出现崩溃,所以只适合临时测试,长期还是要重新编译。

3. 验证依赖是否修复

修改或重新编译后,再用以下命令确认依赖:

readelf -d libdivsufsort.so | grep NEEDED

输出里应该只有libc.so(可能还有其他系统库,但不会有libc.so.6),之后再链接到你的JNI库就能正常加载了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:24:02