android - 在android应用程序中,是否可以使用aarch64 cpu的arm库?

标签 android java-native-interface jna

我在github上找到了一个android应用程序,它是用c++编写的,使用了jni。在它的jniLibs中我只找到了“armeabi-v7a”目录,所有的jni文件(.so)都存储在这里。我的Android手机CPU架构是aarch64(arm-v8a),该应用程序可以在我的手机上正常运行。但是我把SDK搬到自己的app后,总是提示错误

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 位架构构建 native 代码。

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

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

  • Lollipop 之前: adb shell getprop ro.product.cpu.abi
  • Lollipop 及以上: adb shell getprop ro.product.cpu.abilist

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

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

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

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

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

搜索“更多 .so 问题”

希望这有帮助

关于android - 在android应用程序中,是否可以使用aarch64 cpu的arm库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45648766/

相关文章:

android - 发送短信和使用互联网但不调用电话的应用程序是否需要 android.hardware.telephony?

java - 动态加载/重新加载 Java 类时防止重复调用 System.loadLibrary

java - 将未知的 Java 类型转换为 Rust 类型

java - tess4j jna 不满意链接错误

java - 奇怪现象: Java/Swing-operations cause access violation in native library (JNA)

java - 如何使用 JNA 正确映射 `MagImageScalingCallback`?

android viewpager 内存不足

android - 发布库以与 Gradle 一起使用

java - 尝试插入 SQLite 时出现 NullPointerException - Android

java - 从 C/C++ 在内存中写入一个缓冲区,并在没有 JNI 的情况下在 java 中从中读取