如何为我的 Android 应用程序定义辅助 ABI

How do I define a secondary ABI for my Android app

如 Android ABI 指南所述:https://developer.android.com/ndk/guides/abis

安装时自动提取本机代码部分指出:

安装应用程序时,程序包管理器服务会扫描 APK,并查找以下形式的任何共享库:

lib/<primary-abi>/lib<name>.so

If none is found, and you have defined a secondary ABI, the service scans for shared libraries of the form:

lib/<secondary-abi>/lib<name>.so

背景:我的应用程序依赖于通过 JNI 接口访问的外部库,但我只获得了例如libLibrary.so armeabi 架构文件。我的应用程序还使用另一个库,该库支持 arm64-v8a 等几种不同的体系结构。因此,在运行时,我遇到了这样的错误,因为它找不到 libLibrary.so:

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[... /system/lib64]]] couldn't find "libLibrary.so"

编辑:

我在想当我依赖的其他库有.so 文件用于 armeabi-v7a 但不是 armeabi。我已经测试了我的应用程序,当我在 gradle:

中设置时,它可以毫无问题地使用库

ndk.abiFilters "armeabi-v7a"

只输出 apk 文件中的 armeabi-v7a 库,让应用程序只使用它们。

所以,我想知道这样是否合适。我正在使用此处建议的内容:https://medium.com/livefront/native-android-libraries-gone-bad-e7ff63f34bb

正如 Michael 所写,您无法部署部分支持 arm64-v8a 的应用程序。只要您不将应用上传到 Play 商店(例如在开发和测试期间),您就应该从 APK 中删除 64 位二进制文​​件。到今天为止,所有设备仍将 运行 armeabi 二进制文件,但我预计未来几年将只有 64 位设备。

如果您打算通过 Google Play 商店分发该应用,您必须确保您的应用 运行 没有 32 位二进制文​​件。有时,当本机库的源不可用时,在 Java/Kotlin.

中重现缺失的功能会更容易