分析Android :java.lang.UnsatisfiedLinkError: dlopen failed * is 32-bit instead of 64-bit

第三方应用调用系统SO 库失败Caused by: java.lang.UnsatisfiedLinkError: dlopen failed: library 在Android 31平台,尝试使用第三方应用调用系统SO 库,会报如下的错误 Caused by: java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib64/XXX.so" needed or dlopened by "/apex/com.android.art/lib64/libnativeloader.so" is not accessible for the namespace "classloader-namesp 阅读详情

Crash 日志:

java.lang.UnsatisfiedLinkError: dlopen failed: "/data/data/com.ireader.plug.sdk/ireader_plugins/lib/armeabi/lib***.so"
 is 32-bit instead of 64-bit
        at java.lang.Runtime.loadLibrary0(Runtime.java:1016)
        at java.lang.System.loadLibrary(System.java:1657)

问题分析:

首先看log, 报错为:so打开失败,因为lib***.so 是32位的so,而不是64位的。
补充:

Android 程序 运行起来,要么只加载32位的so, 要么只加载64 位的so. 是不能混合加载的。

常见的两种情况如下:

第一种情况:

对于一个android程序,如果程序没有用到任何so,假如程序跑在64位的手机上,虚拟机默认加载64位的so。这时候,如果你加载了32位的so,就会报错。反之,如果程序跑在32位的手机上,虚拟机默认只加载32位的so.

可能有同学有疑问,既然我的程序里面没有任何的so, 跑在了64位的手机上,这种情况下怎么会加载32位的so呢?我的程序里面是没有so 的啊。没错,你的apk 里面是没有任何的so,但是如果你的项目中使用了插件技术,插件apk 里面有32 位的so,这时候就会挂掉了。

解决方法:

在你的项目里面建立一个armeabi 的文件夹,里面放一个文件。文件名字叫做fix.so。这个so 可以是0kb,但是一定要有。这样,程序跑在64位的手机上,发现你只有armeabi 的文件夹,那么就会使用32 位的虚拟机,这时候,加载你插件里面的so,就不会有问题了。

第二种情况:

如果程序里面有so, 并且有arm64-v8a 或者x64 的文件夹,也有armeabi 的文件夹,运行在64位的手机上,会默认使用arm64-v8a 或者x64 文件夹里面的so. 这时候,如果有些so 没有arm64-v8a ,就会报错找不到so。 虽然你在armeabi 文件夹里面有。

如果是这种情况,那么直接把 arm64-v8a 的so 删除掉,只留下armeabi 的so。 因为armebai 兼容所有类型的处理器。当然你也可以把缺少的64位的so 编译一下。

我们项目具体场景:

我们是做插件sdk 给第三方接入的。我们会让第三方接入一个apk文件,里面只有armeabi 的so.
还有一个libmerge.so 用于插件增量更新。但是有些厂商不愿意动态更新,我们定的方案是如果不需要增量更新这个功能,程序里面可以没有libmerge.so 。

早期的时候,手机还都是32位的,所以,没有问题。但是现在都是64位的手机,有的厂商自己apk 没有任何的so, 跑在64为手机上,上来就挂。java.lang.UnsatisfiedLinkError: dlopen failed * is 32-bit instead of 64-bit

他们反馈在有些手机会出现,有些手机可以正常运行。当然,可以运行的都是32位手机,不可以的都是64位的手机。

这时候,我们让厂商放在armeabi 文件夹下一个fix.so。虽然是一个空文件,但是程序就可以跑起来。这样,程序跑在64位的手机上,发现你只有armeabi 的文件夹,那么就会去加载32 位的so,这时候,加载你插件里面的so,就不会有问题了。

知识补充:

如何查看android cpu是32位还是64位?

adb shell getprop ro.product.cpu.abi

C:\Users\zy>adb shell getprop ro.product.cpu.abi
arm64-v8a


C:\Users\zy>adb shell getprop ro.product.cpu.abi
armeabi-v7a


android:sharedUserId="android.uid.system”
用了这个,系统会找v8a的库
 

可以看到手机默认的so 文件夹。arm64-v8a 是64位的。另外,一般手机内存超过4G 都是64位的,因为32支持的最大内存是4G.

系统App启动异常之 java.lang.UnsatisfiedLinkError: dlopen failed: library “libopencv_java3.so“ not found 项目场景: 作为系统App启动异常之 java.lang.UnsatisfiedLinkError: dlopen failed: library “libopencv_java3.so” not found 问题描述: 将apk 放到system/app下作为启动App,启动时异常报错加载不到第三方库相关的.so文件 捕捉异常日志分析 2021-03-21 20:06:30 SUPPORTED_64_BIT_ABIS=[Ljava.lang.String;@3fd2815 versionCode=23 阅读详情

相关推荐

相机基础知识讲解:CMOS和CCD

相机基础知识讲解:CMOS和CCD

Coppa的博客 5万+

运行报错:java.lang.UnsatisfiedLinkError: dlopen failed:“XXXX.so“ has bad ELF magic: 00000000

在升级app后,出现以下错误信息:java.lang.UnsatisfiedLinkError: dlopen failed:"XXXX.so" has bad ELF magic: 00000000

IT熊的专栏 3128

从CMOS到CML:手把手教你为PLL选对分频器电路(附性能对比与选型指南)

本文深入解析了PLL分频器电路的三大主流架构——静态CMOS、动态TSPC和CML,通过性能参数对比和实测数据,提供了从频率需求、功耗预算到噪声防护的完整选型指南。特别针对高频应用的CML分频器设计要点和混合架构优化方案,为射频与模拟IC设计工程师提供实用参考。

weixin_30887919的博客 458

Android Crash解决方案之java.lang.UnsatisfiedLinkError

该错误类型较多,以下进行分类: 1、java.lang.UnsatisfiedLinkError : dlopen failed: library //dlopen打开失败 2、java.lang.UnsatisfiedLinkError :findLibrary returned null //找不到library 3、java.lang.UnsatisfiedLinkError

网易云捕博客 1万+

VS2019 +osg3.6.5+ earth3.2+qt5.14.2+osgQt 编译教程

用vs新建工程,稍后会在写一篇博客上分享四、结语至此,所有的编译就均已完成。

king_ink的博客 1134

基于fMRI数据计算脑脊液(CSF)与全脑BOLD信号的时间耦合分析

BOLD和CSF信号有多相似CSF信号要延迟多少时间才能最匹配BOLD信号BOLD-CSF的互相关公式lag:时间延迟采样点数BOLD信号CSF信号延迟时间点对应的相关系数。

Rose9614的博客 2982

java instead of_分析Android :java.lang.UnsatisfiedLinkError: dlopen failed * is 32-bit instead of 64-b...

Crash 日志:java.lang.UnsatisfiedLinkError: dlopen failed: "/data/data/com.ireader.plug.sdk/ireader_plugins/lib/armeabi/lib***.so"is 32-bit instead of 64-bitat java.lang.Runtime.loadLibrary0(Runtime.java...

weixin_33751984的博客 290

程序员必备75道逻辑思维题(附答案)之二

逻辑训练 身为一个大数据工程师,平时的算法训练还是不能少的,今天给大家看几道我曾经看到的逻辑思维题觉得很好,想分享一下。 【6】一个球、一把长度大约是球的直径2/3长度的直尺.你怎样测出球的半径?方法很多,看看谁的比较巧妙 【7】五个大小相同的一元人民币硬币。要求两两相接触,应该怎么摆? 【8】猜牌问题 S先生、P先生、Q先生他们知道桌子的抽屉里有16张扑克牌:红桃A、Q、4 黑桃J、8、4、2、...

蛋蛋淡淡定的庄园 3547

android极光推送no bit-32,分析Android :java.lang.UnsatisfiedLinkError: dlopen failed * is 32-bit instead of...

Crash 日志:java.lang.UnsatisfiedLinkError: dlopen failed: "/data/data/com.ireader.plug.sdk/ireader_plugins/lib/armeabi/lib***.so"is 32-bit instead of 64-bitat java.lang.Runtime.loadLibrary0(Runtime.java...

weixin_39622760的博客 300

Springboot + vue 实现导出word

Springboot + vue 实现导出word 后端代码 使用word先创建好已知的模板 使用word工具另存为.xml格式的文件 使用freemarker ftl模板 将修改后的xml文件复制到开发工具中,将文件后缀修改为ftl文件,并且将里面的动态值使用${}包裹例如:${zyjn} word工具类 /*** * * Project Name:maventest * <p>生成word工具类<br> * * @ClassName: WordUtil *

qq_45542373的博客 2895

SpringBoot整合JWT实战:从零构建无状态认证系统,详解Token生成、验证与安全最佳实践

JWT在SpringBoot中的实现与应用 摘要:本文介绍了JWT(JSON Web Token)的基本概念、与Session机制的对比,以及SpringBoot项目中JWT的整合实现。JWT由Header、Payload和Signature三部分组成,具有无状态、跨域支持等优势。文章详细展示了如何在SpringBoot项目中配置JWT环境,封装JWT工具类来实现Token的生成、解析和验证功能,包括密钥管理、自定义声明、签名验证等核心操作。通过对比表格和生活化比喻,帮助读者理解JWT与传统Session的

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1775

java.lang.UnsatisfiedLinkError: dlopen failed: /data/app/com.smallvideo-1/lib/arm/libutility.so: has

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/user/0/com.dashou.wawaji/app_dex/ysdk_hackdex.jar", zip file "/data/app/com.da...

wddptwd28的博客 2991

【技能】OpenClaw Skills学习及手搓一个极简skill

本文介绍了OpenClaw Skills的基础概念与使用方法。Skills是OpenClaw代理使用工具的核心载体,通过SKILL.md文件定义技能属性和执行方式。技能加载遵循"工作区>本地>内置>自定义目录"的优先级规则。用户可通过ClawHub一键安装现成技能,也可自定义开发技能:创建技能目录,编写包含YAML元数据和执行指令的SKILL.md文件,放置于工作区skills目录进行测试。文章还介绍了多代理场景下的技能共享、插件集成以及安全注意事项,包括沙箱使用和敏感

海兰 3976

java.lang.UnsatisfiedLinkError: dlopen failed: "/data/xxxxx.so" has bad ELF magic

java.lang.UnsatisfiedLinkError: dlopen failed: "/data/xxxxx.so" has bad ELF magic 原因是引入的.so库未能做好兼容。解决方案是在defaultConfig里面增加: ndk {     abiFilters "armeabi-v7a" } 强制Android的ndk兼容armeabi-v7a体系架构。排除其...

Zhang Phil 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "__exidx_end" referenced by

参考: Error trying to load SQL Cipher JNI libs using cordova on Android 4.4.2Issue 109071: [gold] ndk-10d defaul linker produces corrupt binaries, cannot locate symbol “__exidx_end”NDK编译库运行时报dlopen fail

薛瑄的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

解决加载so时出现java.lang.UnsatisfiedLinkError dlopen failed xxx.so is 32-bit instead of 64-bit异常的问题

解决加载so时出现如下异常: java.lang.UnsatisfiedLinkError: dlopen failed: "/data/user/0/com.test/.../libtest.so" is 32-bit instead of 64-bit 说明当前App加载的so都是64位的,而libtest.so是32位的,所以加载时抛出异常。因为App加载so时,只能加载同样位数的so:只加载32位的so或只加载64位的so,不能混合加载。 所以可能出现这种问题的情况有: 1. App打包有问题

冰雪世界 1030

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

is 32-bit instead of 64-bit动态库错误分析

前段时间因项目需要,需要MP3格式的录音,需要引用LAME开源库,在引用so库文件时,提示java.lang.UnsatisfiedLinkError: dlopen failed: "liblame.so" is 32-bit instead of 64-bit错误,网上分析了出现这种情况的原因,可能是混合使用了32bit和64bit的库文件,如果系统先使用64bit的库文件时,则后续的库文件都

chewbee的专栏 7483

java.lang.UnsatisfiedLinkError: dlopen failed: library "libsqlite.so" not found

今天在as运行项目,遇到报错java.lang.UnsatisfiedLinkError: dlopen failed: library "libsqlite.so" not found,查看原因发现和Android版本有关 项目在7.0以下系统的手机上运行正常,但在7.0的手机上运行异常。 出现这个问题的原因是:从 Android 7.0 开始,Android系统将阻止应用动态链接非公开 N...

qq_20517789的博客 3201

java.lang.UnsatisfiedLinkError: dlopen failed: library

2: adb pull /system/etc/public.libraries.txt [你要保存的目录]4. adb push [public.libraries.txt 所在的路径] /system/etc/3:将你要用的到 XXX.so 加入到 /system/etc/public.libraries.txt。将你要用的到 XXX.so 加入到 /system/etc/public.libraries.txt。

lwz的博客 3458

java.lang.UnsatisfiedLinkError: dlopen failed: library “libijkffmpeg.so“ not found -----ijkmediaplay

ndk {

qq_51108920的博客 3715

Android -- is 32-bit instead of 64-bit

用 android studio 开发 app 的时候发生了 java.lang.UnsatisfiedLinkError: dlopen failed: "lib_xxx.so" is 32-bit instead of 64-bit 最后是如此解决的,在build.gradle中加上 defaultConfig { ...... ndk { abiFilt

1207

java.lang.UnsatisfiedLinkError: dlopen failed: /lib/arm64/libc++_shared.so not found

libc++_shared.so

牛八少爷的专栏 2456

java.lang.UnsatisfiedLinkError: dlopen failed

今天在做一个SDK开发的时候,因为library中用到了.so库文件,所以我直接从之前的项目中复制过来对应的.so文件到libs中,但是开发完成后,运行直接到native方法处就崩溃。。。我一脸蒙蔽哈。。。 这TM什么情况,在native处崩溃后,没有任何错误提示,搞的我1个小时定位问题。。。 最后实在搞不了了,还是写了个日志输出代码,发现这个错误: java.lang.Unsatisf...

树懒的博客 9735
上一篇: window系统下如何查看so库的信息
下一篇: Android Gradle Plugin Version和Gradle Version 对应关系
尕尕Lula
博客等级 码龄11年 12粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值