ARM64 运行 ARM 汇编可以兼容模式吗?

Can ARM64 run ARM assembly in compatibility mode?

这是一个第 3 方库,我无法访问它的源代码 - 要求他们为 ARM64 构建到目前为止没有任何效果,尽管他们声称 Android 8.0(仅 ARM64)会是"supported".

以下 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 failed: "/data/app/ ... /base.apk!/lib/arm64-v8a/somelibrary.so" is 32-bit instead of 64-bit.

似乎 AArch32 执行会是 "optional"(甚至可能不可用)- 因为人们(很可能)必须将 CPU 从 AArch64AArch32 执行。例如。此幻灯片涵盖的主题:Linux on AArch64 ARM 64-bit Architecture.

问:有没有办法在 64 位 Android 设备上使用 32 位库?


事实证明,这不被 Google Play 接受 - 需要提供 ARM64 本机汇编。

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

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

  1. 您的进程不能混合使用 64 位和 32 位代码 -- 它必须是其中之一。
  2. 您的操作系统(或您)必须提供您 link 的所有动态库的 32 位版本。
  3. 您的 OS 内核必须支持 32 位进程;当您的进程使用 CPU.
  4. 时,它将负责切换执行模式

3号没问题; Android 使用 Linux-like 内核,支持 arm64 上的 arm32 进程。

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

当然,在手机上同时提供 32 位和 64 位库意味着 OS 占用更多存储空间 space,因此纯 64 位设备绝对有可能成为未来的事情。任何 32 位游戏或应用程序都无法在这些设备上运行。

第 1 个问题是您的问题:您的应用 运行宁作为 64 位进程,并正在尝试加载 32 位库。这行不通。

解决方案是让您的应用仅支持 32 位。不过,如果你能避免这一切,我会建议不要使用它(即不要使用那个库)。您的应用无法在未来可能发布的任何仅 64 位设备上运行。