这是一个第三方库,我无法访问它的源代码-要求他们为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位库?
答案 0 :(得分:3)
您在智能手机中找到的任何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位设备上运行。