ARM64可以在兼容模式下运行ARM程序集吗?

时间:2018-09-08 10:42:01

标签: android native android-8.0-oreo arm64

这是一个第三方库,我无法访问它的源代码-要求他们为ARM64进行构建到目前为止没有任何效果,尽管他们声称将“支持” Android 8.0(仅ARM64)。

以下Java代码在armv7l上运行,但在aarch64上失败:

static {
    switch(System.getProperty("os.arch")){
        case "aarch64":
        case "armv7l":
            try {
               System.loadLibrary("somelibrary");
            } catch(UnsatisfiedLinkError e) {
                Log.e(LOG_TAG, e.getMessage());
            }
            break;
    }
}
  

dlopen失败:“ / data / app / ... /base.apk!/lib/arm64-v8a/somelibrary.so”是32位而不是64位。

似乎AArch32执行是“可选的”(甚至可能不可用),因为(很可能)必须将CPU从AArch64切换到{{1 }}执行。例如。该幻灯片显示的主题是:Linux on AArch64 ARM 64-bit Architecture

问:除了反向反汇编外,还有没有办法在64位Android设备上使用32位库?

1 个答案:

答案 0 :(得分:3)

您在智能手机中找到的任何arm64 CPU也应该能够运行arm32代码。

但是,至少需要满足三个要求:

  1. 您的进程不能混合使用64位和32位代码-它必须是一个或另一个。
  2. 您(或您)的操作系统必须提供链接到的所有动态库的32位版本。
  3. 您的OS内核必须支持32位进程。它会负责在您的进程使用CPU时切换执行模式。

数字3可以; Android使用Linux-like内核,该内核支持arm64上的arm32进程。

数字2可能是 ;我不知道您在哪里听说过Android 8.0仅是64位,但事实并非如此。设备制造商可以选择排除32位支持,但我不知道有什么支持(因为这样做会阻止仅32位的旧版应用和游戏在其设备上运行)。

当然,在手机上同时提供32位和64位库意味着操作系统占用了更多的存储空间,因此将来仅64位设备肯定会成为一件大事。在这些设备上,不能使用仅32位游戏或应用。

数字1是您的问题:您的应用程序以64位进程的形式运行,并试图加载32位库。这是行不通的。

解决方案是使您的应用仅32位。不过,如果您可以避免全部使用,建议不要使用它(即不要使用该库)。您的应用无法在将来可能会发布的任何仅64位设备上运行。