我在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/