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

问题描述 投票:2回答:1

这是第三方库,我无法访问它的源代码 - 要求他们为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切换到AArch32执行。例如。这个幻灯片展示了主题:Linux on AArch64 ARM 64-bit Architecture

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

android native android-8.0-oreo arm64
1个回答
3
投票

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

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

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

3号很好; Android使用Linux-like内核,它支持arm64上的arm32进程。

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

当然,在手机上运送32位和64位库意味着操作系统占用更多的存储空间,因此未来64位设备肯定是可能的。没有32位游戏或应用程序可以在这些设备上运行。

数字1是您的问题:您的应用程序作为64位进程运行,并且正在尝试加载32位库。这不行。

解决方案是使您的应用程序仅32位。但是,如果你可以避免这一切,我会建议反对它(即不要使用该库)。您的应用程序无法在将来可能发布的任何64位设备上运行。

© www.soinside.com 2019 - 2024. All rights reserved.