【Android】导入第三方库时,关于so文件的一些思考

2023-11-23 03:40

本文主要是介绍【Android】导入第三方库时,关于so文件的一些思考,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

测试手机:红米note3
手机abi:arm64-v8a

首先问题的起源于异常如下:

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/xxx.xxxxx.xxx/base.apk"],nativeLibraryDirectories=[/data/app/xxx.xxxxx.xxx/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find "libxxxx_4_1.so"at java.lang.Runtime.loadLibrary(Runtime.java:366)at java.lang.System.loadLibrary(System.java:989)at com.baidu.mapapi.BMapManager.<clinit>(Unknown Source)at xxx.xxxxx.xxx.XxxxApplication.initEngineManager(XxxxApplication.java:195)at xxx.xxxxx.xxx.XxxxApplication.onCreate(XxxxApplication.java:105)at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1016)at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4797)at android.app.ActivityThread.access$1500(ActivityThread.java:176)at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1498)at android.os.Handler.dispatchMessage(Handler.java:111)at android.os.Looper.loop(Looper.java:194)at android.app.ActivityThread.main(ActivityThread.java:5578)at java.lang.reflect.Method.invoke(Native Method)at java.lang.reflect.Method.invoke(Method.java:372)at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:955)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:750)

在此之前,库的目录(so部分)如下:
库的目录(so部分)
出现问题的原因是 在上图的arm64-v8a中没有找到libxxxx_4_1.so。不过实际,也真的没有这个文件,第三方都未提供64位的版本,而针对库的支持有如下规则(如有纰漏,欢迎评论指正):

64手机支持32库、64库
32手机支持32库

即理论上仅提供32位的库,就可以满足支持。所以我试着将目录arm64-v8a删除,但是之后运行,错误依旧在。

好,我就来看看这个错误。这个异常很明显是说,系统试图从nativeLibraryDirectories中加载指定的so文件,但没找到。我原先的想法,如果arm64-v8a中找不到,系统应该到armeabi中去找,毕竟armeabi是个缺省的so目录。但实际结果貌似不会去armeabi中查到。

但是奇怪的是,删除arm64-v8a目录之后,运行也出错。按照简单理解,arm64-v8a目录已经没有了,应该不会在从arm64目录中找so才是。除非,系统根据手机abi指定目录加载,然而实际不是。

至此要感谢合作方(@范淋)的帮助找到了这个资源,system-loadlibrary-couldnt-find-native-library-in-my-case,主要信息如下图:
system-loadlibrary-couldnt-find-native-library-in-my-case
他的说法中有建议直接打开(解压缩的形式)生成的apk文件,查看是否有”不合理”的目录存在。在我的情况中的确看到了arm64-v8a目录。目录中有一个其他第三方的so文件,最后问题由于依赖项目有个arm64-v8a目录,所以如果要移除某个类目,一定要删干净。

从原则来讲,只要提供armeabi和armeabi-v7a 就可以满足兼容支持,但是如果能提供完整的64位版本,可以更好的利用该架构的芯片,得到更高性能。

这篇关于【Android】导入第三方库时,关于so文件的一些思考的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/415076

相关文章

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

TP-Link PDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务

《TP-LinkPDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务》近期,路由器制造巨头普联(TP-Link)在用户群体中引发了一系列重要变动,上个月,公司发出了一则通知,明确要求所... 路由器厂商普联(TP-Link)上个月发布公告要求所有用户必须完成实名认证后才能继续使用普联提供的 D

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

关于rpc长连接与短连接的思考记录

《关于rpc长连接与短连接的思考记录》文章总结了RPC项目中长连接和短连接的处理方式,包括RPC和HTTP的长连接与短连接的区别、TCP的保活机制、客户端与服务器的连接模式及其利弊分析,文章强调了在实... 目录rpc项目中的长连接与短连接的思考什么是rpc项目中的长连接和短连接与tcp和http的长连接短

Python数据处理之导入导出Excel数据方式

《Python数据处理之导入导出Excel数据方式》Python是Excel数据处理的绝佳工具,通过Pandas和Openpyxl等库可以实现数据的导入、导出和自动化处理,从基础的数据读取和清洗到复杂... 目录python导入导出Excel数据开启数据之旅:为什么Python是Excel数据处理的最佳拍档

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Python模块导入的几种方法实现

《Python模块导入的几种方法实现》本文主要介绍了Python模块导入的几种方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录一、什么是模块?二、模块导入的基本方法1. 使用import整个模块2.使用from ... i

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超