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的交叉编译工具链来编译:
- 下载对应版本的Android NDK,找到工具链路径(比如
${NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin) - 针对你的目标架构(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 - 编译完成后,用
readelf -d libdivsufsort.so | grep NEEDED检查依赖,应该会看到libc.so而不是libc.so.6。
- 下载对应版本的Android NDK,找到工具链路径(比如
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
相关产品推荐
相关产品推荐

