在 android 应用程序中,是否可以将 arm 库用于 aarch64 cpu?

In android app, is it possible to use arm library for a aarch64 cpu?

我在github中找到了一个android应用程序,它是用c++编写的,使用了jni。在它的 jniLibs 中我只找到了 "armeabi-v7a" 目录,所有的 jni 文件(.so)都存储在这里。我的 android phone cpu 架构是 aarch64(arm-v8a),应用程序可以 运行 在我的 phone 上运行良好。但是我在自己的app中移动SDK后,总是提示错误

java.lang.UnsatisfiedLinkError: Native library (com/sun/jna/android-aarch64/libjnidispatch.so) not found in resource path (.)

但是在示例应用程序中,当我删除相同的“.so”文件时,它说:

java.lang.UnsatisfiedLinkError: Native library (com/sun/jna/android-arm/libjnidispatch.so) not found in resource path (.)

那么,发生了什么?

通常,Android 设备确实支持多个 ABI,而 64 位设备确实支持为某些 32 位架构构建本机代码。

例如,arm64(64 位)设备将始终支持 armeabi-v7a(32 位),以确保与旧应用程序的兼容性。这是直接来自 Google.

的要求

例如,要查看您的设备支持哪些架构,运行:

  • 棒棒糖之前: adb shell getprop ro.product.cpu.abi
  • 棒棒糖及更高级别: adb shell getprop ro.product.cpu.abilist

作为命令的结果,您应该会看到几个 ABI 的列表。

我最近阅读了一篇来自 Realm 的开发博客,其中他们解决了一些与 JNI 相关的问题。其中之一与您所面临的情况相似。

他们的结论是 Android 当同一个应用程序需要加载 64 位和 32 位本机库时会感到困惑,并且只尝试加载 64 位版本,即使依赖项只有其 32 位版本本机代码。

在您的情况下,您尝试加载 32 位的本机库构建,但 Android 尝试加载其 64 位版本。如果您的其他依赖项之一具有 64 位本机库,则可能会发生这种情况。

我提到的开发博客:https://academy.realm.io/posts/kenneth-geisshirt-tales-developing-sdks-at-scale/

搜索 "More .so Issues"

希望对您有所帮助