生活
so库 、so库cc官网
2023-04-04 16:43  浏览:46

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官网的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

发表评论
0评