当前知识库站点已不再维护。请移步新版知识库:https://help.rongcloud.cn/

Android 设备上怎么做 64 位兼容?

目前Android的主流还是32位设备,一般各厂商都会提供32位库,因此一般来说,在64位Android设备以32位进程模式启动一般不会有问题。但是如果在某些64位平台上出现了这样的错误: java.lang.UnsatisfiedLinkError: dlopen failed: “***.so”
发布时间: 2018-04-13 11:31

回答:

可能的原因是:

在安装APK的时候,系统会按照Build.SUPPORTED_ABIS去查找APK的lib目录下的native库的目录(现有的ABI:armeabi, armeabi-v7a,arm64-v8a, x86, x86_64, mips64, mips)。 如果在app中有兼容64-bit的目录但是又缺少库文件的话,并不会使用其他ABI目录下的库文件替换所缺少的库文件进行安装,这些库不混合使用,也就是说需要为每个架构提供对应的库文件。 Android在加载native库的时候有回退(fallback)机制,在64位系统上如果app并不存在arm64-v8a的目录,则会尝试寻找armeabi-v7a下面的库进行加载,一般来说是向下兼容的。

出现该问题的解决方案如下:

方法1: 在构建应用程序的时候,在工程(project)里删除所有arm64-v8a下面的库以及该目录;在生成app后,确认apk的包内lib下没有arm64-v8a的目录。


方法2: 在gradle构建文件中设置abiFilters,只打包32位架构的库:

android {

defaultConfig {

ndk {
    //选择要添加的对应 cpu 类型的 .so 库。
    abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
    // 还可以添加 'x86', 'x86_64', 'mips', 'mips64'
}

}

}