Android Studio引入.so库遇unexpected e_machine:62及依赖库缺失问题求助
解决Android加载.so库的两个核心问题:架构不匹配与依赖缺失
针对你遇到的两个加载错误,我来逐一拆解原因并给出具体的修复方案:
一、Galaxy S7上的unexpected e_machine:62错误分析与修复
这个错误的核心是**.so库的架构和设备不匹配**:e_machine:62对应的是x86_64架构的ELF文件,但你的Galaxy S7是ARM64(arm64-v8a)架构设备。错误日志里明确显示,系统在arm64目录下找到的libopendnp3java.so实际上是x86_64版本的,自然无法加载。
问题根源
你大概率把不同架构的.so文件放混了目录——把x86_64版本的库误放到了jniLibs/arm64-v8a下,而正确的ARM64版本库没有到位。
修复步骤
- 核对每个目录的.so版本
确保jniLibs下的每个子目录都对应正确架构的库:arm64-v8a:存放ARM64架构的libopendnp3java.soarmeabi-v7a:存放32位ARM架构的库x86:存放32位x86架构的库x86_64:存放x86_64架构的库
- 验证库的架构(可选但推荐)
用readelf工具(Linux/macOS可用)检查库的架构:
输出示例:ARM64会显示readelf -h libopendnp3java.so | grep MachineMachine: AArch64,x86_64会显示Machine: Advanced Micro Devices X86-64。 - 清理重建项目
执行Android Studio的Build > Clean Project,再Build > Rebuild Project,然后卸载设备上的旧应用重新安装。
二、模拟器上的library "libasiodnp3.so.2" not found错误修复
这个问题是动态链接库的依赖问题,Android的动态链接器有两个关键限制:
- 只识别以
lib开头、.so结尾的库名,不支持带版本号的后缀(比如.so.2) - 依赖库必须和主库在同一目录,且要先加载依赖库再加载主库
修复方案
- 重命名依赖库
将libasiodnp3.so.2重命名为libasiodnp3.so,并确保它和libopendnp3java.so一起放在每个对应的jniLibs/[abi]目录下。注意:如果
libopendnp3java.so编译时硬依赖libasiodnp3.so.2,重命名后可能需要用patchelf工具修改主库的依赖名称(Linux环境下操作):patchelf --replace-needed libasiodnp3.so.2 libasiodnp3.so libopendnp3java.so - 调整加载顺序
在Java代码中先加载依赖库,再加载主库:static { System.loadLibrary("asiodnp3"); // 先加载依赖的asiodnp3库 System.loadLibrary("opendnp3java"); // 再加载主库 } - 清理重建
同样执行清理和重建操作,确保所有依赖库都被正确打包到APK中。
额外优化建议
- 移除
gradle.properties中的android.useDeprecatedNdk=true,现在Android Studio已经不推荐使用废弃的NDK集成方式,如果你没有自定义的NDK编译逻辑,这个配置完全没必要。 - 确认Module级别的
build.gradle中sourceSets正确指向jniLibs(默认已配置,可检查):android { sourceSets { main { jniLibs.srcDirs = ['src/main/jniLibs'] } } }
内容的提问来源于stack exchange,提问作者nalgenes
相关产品推荐
相关产品推荐

