这是第三方库,我无法访问它的源代码 - 要求他们为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位库?
您在智能手机中找到的任何arm64 CPU也应该能够运行arm32代码。
但是,至少需要满足三个要求:
3号很好; Android使用Linux-like内核,它支持arm64上的arm32进程。
2号可能很好;我不知道你在哪里听说Android 8.0只是64位,但事实并非如此。设备制造商可以选择排除32位支持,但我不知道这样做(因为它会阻止仅32位的旧版应用和游戏在其设备上运行)。
当然,在手机上运送32位和64位库意味着操作系统占用更多的存储空间,因此未来64位设备肯定是可能的。没有32位游戏或应用程序可以在这些设备上运行。
数字1是您的问题:您的应用程序作为64位进程运行,并且正在尝试加载32位库。这不行。
解决方案是使您的应用程序仅32位。但是,如果你可以避免这一切,我会建议反对它(即不要使用该库)。您的应用程序无法在将来可能发布的任何64位设备上运行。