这是一个第三方库,我无法访问它的源代码-要求他们为ARM 64构建到目前为止没有任何效果,尽管他们声称Android 8.0(仅支持ARM 64)将被“支持”。
以下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/arm 64-v8 a/somelibrary.so“是32位而不是64位。
看起来,好像AArch32
执行是“可选的”(甚至可能不可用)-因为人们(很可能)必须将CPU从AArch64
切换到AArch32
执行。Linux on AArch64 ARM 64-bit Architecture .
问:有没有办法在64位Android设备上使用32位库?
事实证明,Google Play不接受这一点-需要提供ARM 64本机汇编。
1条答案
按热度按时间jm81lzqq1#
你在智能手机中找到的任何arm 64 CPU都应该能够运行arm 32代码。
但是,至少需要满足三个要求:
1.您的进程不能混合使用64位和32位代码--它必须是其中之一。
1.您的操作系统(或您自己)必须提供您链接到的所有动态库的32位版本。
1.您的操作系统内核必须支持32位进程;它将负责在进程使用CPU时切换执行模式。
3号很好;Android使用Linux-like内核,支持arm 64上的arm 32进程。
第二个是“可能”很好;我不知道你从哪里听说Android 8.0只支持64位,但这不是真的。设备制造商可以选择排除32位支持,但我不知道有哪个制造商这样做(因为这会阻止仅支持32位的旧版应用程序和游戏在他们的设备上运行)。
当然,在手机上同时发布32位和64位的库意味着操作系统占用更多的存储空间,所以未来只支持64位的设备肯定是有可能的。没有32位的游戏或应用程序可以在这些设备上运行。
第一个是你的问题:您的应用正在作为64位进程运行,并且正在尝试加载32位库。这将不起作用。
解决方案是让你的应用程序只支持32位。如果你能避免这一切,我建议你不要使用它(也就是说,不要使用那个库)。你的应用程序将无法在未来可能发布的任何64位设备上运行。
2023年更新
现在就是未来!
Google Pixel 7系列come without OS support for 32-bit applications
另外,从今年或明年开始,new ARM CPUs will not have 32-bit support at all。
我们宣布,从2023年起,所有Arm Cortex-A CPU移动的内核将仅为64位。