首页 > 解决方案 > 如何为我的 Android 应用定义辅助 ABI

问题描述

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

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

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

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

如果没有找到,并且您已定义辅助 ABI,则服务会扫描以下形式的共享库:

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

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

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

编辑:

我想知道当我依赖的其他库有armeabi-v7a 但没有 armeabi 的.so文件时,我是否可以将 armeabi 文件夹中的文件复制libLibrary.so到 armeabi-v7a 文件夹中。我已经测试了我的应用程序,当我在 gradle 中设置时它使用库没有问题:

ndk.abiFilters "armeabi-v7a"

仅在 apk 文件中输出 armeabi-v7a 库以使应用程序仅使用它们。

所以,我想知道这样是否很好。我正在使用这里的建议:https ://medium.com/livefront/native-android-libraries-gone-bad-e7ff63f34bb

标签: androidgradlejava-native-interfaceabi

解决方案


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

如果您打算通过 Google Play 商店分发应用程序,则必须确保您的应用程序在没有 32 位二进制文​​件的情况下运行。有时,当本地库的源不可用时,更容易在 Java/Kotlin 中重现缺失的功能。


推荐阅读