Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android的NDK开发中的UnsatisfiedLinkError

Android的NDK开发中的UnsatisfiedLinkError

作者头像
NaOH
发布于 2018-05-29 03:40:04
发布于 2018-05-29 03:40:04
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

首先UnsatisfiedLinkError的种类很多,我这里遇到的是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java.lang.UnsatisfiedLinkError:
nativeLibraryDirectories=[*****/lib/arm64, *****/lib/arm64-v8a, /vendor/lib64, /system/lib64]]] couldn't find "libmytool.so"

可以看到我这里主要是因为在这几个文件夹中都没有找到我的so库导致的。 仔细一看,我的jniLibs中确实只有一个armeabi-v7文件夹,于是我添加了如下的文件夹:

然后在各个文件夹中,都把我的so文件放了一份。 但是直接跑,发现它提示我的so文件是一个32bit的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 java.lang.UnsatisfiedLinkError: dlopen failed: "****/lib/arm64/libmytool.so" is 32-bit instead of 64-bit

经过下面两篇文章的指导:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://stackoverflow.com/questions/27186243/use-32-bit-jni-libraries-on-64-bit-android
https://corbt.com/posts/2015/09/18/mixing-32-and-64bit-dependencies-in-android.html

我在build.gradle中添加了下面的部分:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
android {
compileSdkVersion 24
buildToolsVersion "24.0.0"

defaultConfig {
    ……
    ndk {
        abiFilters "armeabi-v7a", "x86"(后面还可以加其他的,但是我这里只加了x86就可以跑了)
    }
}
buildTypes {
    ……
}
sourceSets.main {
    jni.srcDirs = ['src/main/jni','src/main/jniLibs']
    //这个地方也是一个容易出错的地方,虽然默认的jni目录是'src/main/jni',但是so文件直接放进去经常会出错,一般会在jni中放c文件,然后在同级目录下创建一个jniLibs文件夹用于放so库
}

} 可以看到,在我加了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 ndk {
        abiFilters "armeabi-v7a", "x86"(后面还可以加其他的,但是我这里只加了x86就可以跑了)
    }

之后,等于对原来的jni中的文件夹做了一个筛选,只选入了这里标识的"armeabi-v7a"和"x86",所以不会再导入arm64中的文件,因此也不会出错了(arm64中的自然都应该是64位的库,而"armeabi-v7a"和"x86"则可以是32位的)

不过我还是很疑惑,为什么这个破手机提示我在下面的文件夹中没有找到so库,然而我加的文件夹是x86啊,跟这些文件夹也搭不上关系…不知道为啥就能跑起来了。我感觉,嗯,很奇葩。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
*****/lib/arm64, *****/lib/arm64-v8a, /vendor/lib64, /system/lib64]]

注:笔者当时用的是某菊花场的手机进行的测试…算了不提了…

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年08月09日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android项目开发填坑记-so文件引发的攻坚战
我负责的项目A要求有播放在线视频的功能,当时从别人的聊天记录的一瞥中发现百度有相关的SDK,当时找到的是Baidu-T5Player-SDK-Android-1.4s,项目中Demo的so库只有armeabi-v7a 版的,由于需要使用的时候拷贝一些界面和图片资源到现有的项目中,所以我就索性直接打包成了aar,经过一番修改就上线了。
他叫自己MR.张
2019/07/01
1.4K0
android开发 加载so库的解析和出现的各种错误分析
早期的Android系统几乎只支持ARMv5的CPU架构,你知道现在它支持多少种吗?7种!
再见孙悟空_
2023/02/10
2.5K0
android开发 加载so库的解析和出现的各种错误分析
java.lang.UnsatisfiedLinkError 解决方法
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.pckgname.live-2/base.apk"],nativeLibraryDirectories=[/data/app/com.pckgname.live-2/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find "libvinit.so" 
103style
2022/12/19
1.1K0
java.lang.UnsatisfiedLinkError 解决方法
[-NDK 导引篇 -] 在NDK开发之前你应知道的东西
前言 笔者看了一些NDK的项目。一些教程不是HelloWord就是直接整FFmpeg或OpenCV,可谓一个天一个地,而且目录结构和Android3.5的默认结构并不是太一致,一直没找到什么合心的文章。故写此文连接这天地,来总结一下在NDK开发之前你应知道的东西。 ---- 在此之前,先划分三类人,如果不认清自己是什么角色(垃圾)就去玩NDK,你会很糟心: user : 纯粹.so链接库使用者(伸手党) creator : 纯粹ndk开发者,创作.so链接库(创作家) designer : 在现
张风捷特烈
2020/04/30
7230
[-NDK 导引篇 -] 在NDK开发之前你应知道的东西
so库你应该知道的基础知识
LLDB全称Low Level Debugger ,并不是低水平的调试器,而是轻量级的高性能调试器
zhangjiqun
2024/12/16
2280
关于so文件你需要知道的知识「建议收藏」
Android系统目前支持以下七种不同的CPU架构:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起),每一种都关联着一个相应的ABI。
全栈程序员站长
2022/10/02
3.1K0
安卓so库你应该注意的事
在这公司那么久也没有弄过ndk开发,作为一个做刷卡头和蓝牙pos的安卓开发程序员这点还是很蛋疼,然后现在重新做一个新的项目,因为以前的so库是放在armeabi文件夹下面的,所以不管是安卓4.4以下还是5.0+是都可以用的,然后里面加了下分享的功能,微信和qq分享还好没有so库,但是新浪微博的就不一样了,里面有7中cpu架构文件,再加上百度的定位,操蛋的事情就发生了,如果删除其他文件夹然后新浪分享时异常,还好百度定位的没有崩溃,然后全部保留吧,硬件连接又出错,果断和硬件厂商联系了下,叫他们提供so库,因为so库为二进制码技术有限不能逆向再重新生成多so库。
全栈程序员站长
2022/06/24
1.3K0
Android 开发 so库文件找不到不错
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.imobi.callblocker-2/base.apk"],nativeLibraryDirectories=[/data/app/com.imobi.callblocker-2/lib/arm, /data/app/com.imobi.callblocker-2/base.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]]] couldn't find "libwebrtc.so"
zhangjiqun
2024/12/16
2600
Android 开发 so库文件找不到不错
再谈Android动态链接库
前不久,我们准备将自己开发的视频播放sdk提供给公司其他部门,在打包的时候,同事问了我一个问题,为什么我们打sdk的时候需要分别提供armeabi和arm64-v8a(ps,还有其他7种CPU架构)。其实这是一个常识问题,针对不同的架构我们肯定要提供不同的动态链接库,所以,在实际开发过程中,我们并不是将这7种so库都集成到我们的项目中去,我们会根据实际情况做一个取舍。 那么旧事重提,我们再来看看Android动态链接库。 简介 早期的Android系统几乎只支持ARMv5的CPU架构,不过到目前为止支持7种
xiangzhihong
2018/02/06
2.7K0
Android NDK 示例-返回字符串,数组,Java对象;兼容性问题
JNI目录,需要mk文件,头文件和源文件。这里头文件和源文件故意不统一文件名,也可实现效果。
AnRFDev
2021/02/01
1.9K0
【错误记录】NDK 报错 java.lang.UnsatisfiedLinkError 的一种处理方案 ( 主应用与依赖库 Module 的 CPU 架构配置不匹配导致 )
NDK 开发 , 在调用 JNI 对应 Java 类时 , 静态代码块中 System.loadLibrary 语句调用时 , 报如下错误 ;
韩曙亮
2023/03/28
1.2K0
【错误记录】NDK 报错 java.lang.UnsatisfiedLinkError 的一种处理方案  ( 主应用与依赖库 Module 的 CPU 架构配置不匹配导致 )
【错误记录】Android Studio 导入外部 so 动态库报错 ( java.lang.UnsatisfiedLinkError | 指定 APK 打包动态库的 CPU 架构 )
外部引用 so 动态库 , 如果只有一个 armeabi-v7a 的动态库 , 那么如果在 arm64 的手机上执行 , 就会报如下出错误 ;
韩曙亮
2023/03/29
7620
【错误记录】Android Studio 导入外部 so 动态库报错 ( java.lang.UnsatisfiedLinkError | 指定 APK 打包动态库的 CPU 架构 )
Android 引用第三方so文件
应用程序二进制接口(Application Binary Interface)定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库。在Android 系统上,每一个CPU架构对应一个ABI:armeabi,armeabi-v7a,x86,mips,arm64- v8a,mips64,x86_64。
码客说
2019/10/22
2.8K0
Android arm64-v8a、armeabi-v7a、armeabi详解「建议收藏」
早期的Android系统几乎只支持ARMv5的CPU架构,后面发展到支持七种不同的CPU架构:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起),每一种都关联着一个相应的ABI。 应用程序二进制接口(Application Binary Interface)定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库。 在Android 系统上,每一个CPU架构对应一个ABI:armeabi,armeabi-v7a,x86,mips,arm64- v8a,mips64,x86_64。 但是最新的谷歌官方文档已经把mips和armv5移除了,如图所示:
全栈程序员站长
2022/07/30
25.2K0
Android arm64-v8a、armeabi-v7a、armeabi详解「建议收藏」
手把手教你如何在Android下进行JNI开发(入门)
(1)LOCAL_PATH:=$(callmy-dir) :指向当前目录的地址,包含该.mk
xuexiangjys
2022/04/18
5.7K0
手把手教你如何在Android下进行JNI开发(入门)
Android的.so文件你需要知道那些知识
.so文件的前世今生 早期的Android系统几乎只支持ARMv5的CPU架构,而现在它可以支持7种,几乎涵盖了市面上大部分的CPU架构。 Android系统目前支持的CPU架构主要包含以下7种:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起),每一种都关联着一个相应的ABI。 二进制接口(ABI) 应用程序二进制接口(Application Binary Interface)定义了二进制文件(尤
xiangzhihong
2018/02/06
1.8K0
Android的.so文件你需要知道那些知识
Android Studio下的JNI开发(一):NDK的配置
今天发送两篇基础的JNI开发和配置的文章,可能大家很多都在应用层开发,但是我感觉JNI的基础配置和原理开发大家有必要了解一下,就推送两篇非常基础,大家都能看懂的文章,如果大家感觉现在用不到,可以稍微看两眼了解一下基础过程,对大家未来可能会有帮助。 随着Android Studio的推出,越来越多的开发者都把项目从Eclipse迁移到了Android Studio上,说明Android Studio相对Eclipse来说,具有很明显的优势。同样对于JNI开发来说,Android Studio的配置比Eclip
非著名程序员
2018/02/02
1.9K0
Android Studio下的JNI开发(一):NDK的配置
【错误记录】Android NDK 错误排查记录 ( java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader )
1 . 错误分析 : 提示没有在 /data/app/kim.hsl.rtmp-1/lib/x86, /system/lib, /vendor/lib 这几个目录中找到 NDK 的入口动态库 libnative-lib.so ;
韩曙亮
2023/03/27
6980
Android NDK开发基础
NDK即Native Development Kit,是Android上用来开发c/c++的开发工具包。 安装步骤:developer.android.com/studio/proj…
没关系再继续努力
2021/12/03
2.1K0
Android NDK开发:打包so库及jar包供他人使用
这篇文章会讲第一种方式来打包so库,这种方式是基于jni层的,需要我们同时提供接口的jar包来配合使用,适用于对方从java层调用我们的库。因为jni中的函数名是有特殊要求的,它会指定jni的java接口的路径,如果不提供jar包,那么使用者就要按照我们在jni头文件中声明的函数名来建立java文件,这将是非常痛苦的。
全栈程序员站长
2022/06/28
2.9K0
Android NDK开发:打包so库及jar包供他人使用
推荐阅读
相关推荐
Android项目开发填坑记-so文件引发的攻坚战
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验