Android下查看SO库的依赖
Android下查看SO库具体还依赖了哪些so库
ndk中的readelf
在ndk的toolchains 中可以找到对应的可执行程序
路径例如:
D:AndroidSDKndk17.2.4988734toolchainsarm-linux-androideabi-4.9prebuiltwindows-x86_64bin 下 arm-linux-androideabi-readelf.exe
一般文件位置在system文件夹下,通过adb或者Android studio的Device File Explore 中可以查看到有lib跟lib64下大量的.so文件,如libmedia.so, libandroid.so, libc.so等
Linux .so库的使用
新建一个sort.c文件,写一个最简单的排序
使用 gcc -o libsort.so -fPIC -shared sort.c 产生libsort.so库。
.so库有两种调用方法:
新建main.c文件:
使用命令 gcc -o main main.c -lsort -L. 编译。
新建main2.c文件:
使用命令 gcc -o main2 main2.c -ldl 编译。动态加载.so库的话需要-ldl。
运行./main2后输出递增序列,调用成功。
使用第三方库出现找不到so库UnsatisfiedlinkError错误的原因以及解决方案
在开发项目的时候我们免不了使用一些第三方的库来进行快速开发,有些第三方库只是简单的一个 jar 包,但是有些使用了 jni 开发,因此会包含 so 库文件,这个时候如果不消息我们就会遇到一个错误: java.lang.UnsatisfiedlinkError ;
最近经常遇到有开发者在问使用环信 sdk 的时候出现这个错误;这里分享下问题原因以及解决方案;
这里需要先解释一下相关信息
hyphenatechatsdk 提供的指令集类型仅提供 armeabi-v7a 、 arm64-v8a 、 x86 三种;
armeabi 和 armeabi-v7a 是相近似的指令集, v7a 是增强型指令集,运行速度,效率均有所提高,他们都是 32 位指令,并且兼容; arm64-v8a 对应 arm64 位指令集;
arm64 位策略和 intel IA32 不一样: intel64 位指令是兼容 intel32 位指令, intel32 位指令编译的程序可以直接在 intel64 位机器上运行;但是 arm 不是, arm64 位和 arm32 位是彼此独立的指令系统,不兼容; arm 这样设计的原因是因为运行在嵌入式上,设计指标更趋向于效率,和耗电考量;实际上 arm64 位芯片上同时包含着 arm64 指令处理器和 arm32 位指令处理器,只不过两个处理器彼此独立;
影响链接的限制条件: armeabi 实际上可以运行在 arm64 位机器上,只不过 Google 增加了限制条件:
所以如果大家再遇到这样的问题,可以先根据以上信息排查下,无非就是某个库的 so 文件放多了,或者某个 so 库的文件放少了,或者是 jar 包和 so 不匹配了,这些只要细心看下 ide 的日志提示,很容易就解决,希望此篇文章能帮大家解决问题,谢谢!
文笔有限,如果问题,欢迎指正 _ ~
查看so库的方法
1.nm -D libxxx.so 打印出符号信息。
我一般这样用:nm -D libxxx.so |grep T
2.ldd libxxx.so 查看依赖关系
3.readelf -a libxxxx.so 用来读取elf信息
我一般这样用:readelf libxxx.so |grep NEEDED 这样也可以读取依赖关系
4.objdump -d libxxxx.so
5.rmp -qfl libxxx.so 这样可以查看so库里面包含的内容,头文件等
6.file libxxx.so 这样可以查看so库的属性
如何查看so库被调用
在windows操作系统中,有时我们关闭程序后,一些相关的进程仍在后台运行,并访问着一些文件,使得我们无法对这些文件及其所属的文件夹进行删除、重命名等操作。
此时,如果知道这个文件/文件夹正在被哪个进程使用,就可以用任务管理器结束这个进程,然后就可以对文件进行修改了。(请谨慎决定是否结束关键的、可能会影响系统正常工作的进程。)
下面介绍下查看的方法。
查看方法
1.打开 资源管理器(Ctrl+Shift+Esc)
2.选择 性能 选项卡
3.点击右下角的 资源监视器
4.选择 概述 选项卡,选择 “磁盘”
5.在“磁盘”下方弹出的列表中,第三列“文件”就是当前被进程打开的文件。
可能需要***化窗口并手动调整列宽才能看清。
6.表中的***列即是打开这个文件的进程名称
可考虑在任务管理器中结束该进程
如果有重名的多个进程,以第二列 PID 为准
如果是Linux就方便很多了,windows还是这方法简单,后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~
关于so库和so库cc官网的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。