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

能否在x86_64架构Android模拟器中加载aarch64编译的库?

在x86_64 Android模拟器中运行aarch64库的可行性与解决方案

核心结论

直接加载aarch64架构的SO库到x86_64模拟器无法原生运行,因为指令集不兼容。但可借助Android模拟器的ARM转译功能间接运行,前提是正确配置APK打包规则。

问题根源分析

  1. 放入arm64-v8a目录却找不到库:x86_64模拟器默认优先加载x86_64架构的库,若APK未配置允许兼容ARM架构,或模拟器未开启转译,系统不会自动加载arm64-v8a下的库。
  2. 放入x86_64目录报错:系统加载SO库时会校验架构标识,发现实际是EM_AARCH64(183)而非EM_X86_64(62),直接抛出UnsatisfiedLinkError,这是架构不匹配的必然结果。

具体解决步骤

1. 启用模拟器ARM转译

  • 使用带Google Play服务的x86_64模拟器镜像(此类镜像默认支持ARM指令转译);纯系统镜像需手动开启转译。
  • 通过adb命令验证转译状态:
    adb shell getprop ro.dalvik.vm.isa.arm64
    
    返回x86_64则表示转译已启用。

2. 配置APK打包规则

修改模块的build.gradle(或build.gradle.kts),确保APK包含arm64-v8a库并允许兼容加载:

android {
    defaultConfig {
        ndk {
            // 保留arm64-v8a库,可同时保留x86_64(若有)
            abiFilters 'arm64-v8a', 'x86_64'
            // 若没有x86_64库,仅保留arm64-v8a即可
            // abiFilters 'arm64-v8a'
        }
    }
    packagingOptions {
        doNotStrip '*/arm64-v8a/*.so'
    }
}

3. 正确放置与加载库

  • 将aarch64架构的SO库放在src/main/jniLibs/arm64-v8a目录,禁止放入x86_64目录。
  • 调用System.loadLibrary("library_name")时,使用库的真实名称(去掉前缀lib和后缀.so)。

最优替代方案

若对性能有要求,直接编译x86_64架构的SO库,放入src/main/jniLibs/x86_64目录,实现原生加载运行,避免转译带来的性能损耗。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:01:22