android - 如何为我的 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
解决方案
正如 Michael 所写,您无法部署部分支持arm64-v8a的应用程序。只要您不将应用程序上传到 Play 商店(例如在开发和测试期间),您就应该从 APK 中删除 64 位二进制文件。到今天为止,所有设备仍将运行armeabi二进制文件,但我预计未来几年只有 64 位设备。
如果您打算通过 Google Play 商店分发应用程序,则必须确保您的应用程序在没有 32 位二进制文件的情况下运行。有时,当本地库的源不可用时,更容易在 Java/Kotlin 中重现缺失的功能。
推荐阅读
- html - 大小改变时保持 HTML 浮动元素不变
- c# - 如何修复不同屏幕尺寸和不同窗口尺寸的 Gridview 高度?
- python - 如何验证两个日期是否相同?
- scala - 为什么当我从 URL 解析 Spark(scala) 中的 jason 字符串时得到 None
- java - 根据 Spring 中的输入返回 Singleton bean
- javascript - 简单的 Web 开发概念我在 +update 上找不到任何信息
- javascript - 在 ReactJS 中获取请求
- ios - 不能对不可变值使用变异成员:“n”是“让”常量
- node.js - 将 csv 文件存储在专用服务器上
- regex - 如何匹配带有可选封装标签的字符串