JNI 学习总结

前言

在 Android 项目中,大家都会或多或少接触过 JNI。一般都是底层同事给出动态库 (.so) ,然后集成进项目中。本文你将学到, 静态库与动态库的区别, 什么是ABI,以及动态库的寻找流程

阅读本文大概需要 2 分钟

目录

目录

概念

静态库 & 动态库

众所周知,Android 是基于 Linux 开发的系统,在 Linux 系统中,共有两种库 静态库动态库,区别如下:

区别总结

这里做一个总结,对于静态库来说:

  • 优是:编译后的执行程序不再需要外部函数库的支持,这是由于静态库的链接方式决定的,静态库是将整个函数库的所有数据打包整合进宿主代码
  • 缺点:由于静态库的链接方式,因此如果静态库发生更新,宿主程序必须重新编译。

对于动态库来说:

  • 优点:动态库升级并不影响宿主程序,不需要重新编译宿主工程。所以升级动态库十分方便。
  • 缺点:由于动态库的链接方式,函数库并没有整合进入程序,因此程序的运行环境必须提供对应的支持库。

ABI

由于 Android 机型众多,不同的厂商的机型往往使用不同的 CPU 架构,支持不同的指令集。CPU 与指令集的对应关系通过应用的二进制接口描述,这个接口就是 ABI.
ABI 的需要定义的具体内容如下:

  • 机器代码应使用的 CPU 指令集
  • 运行时内存存储和加载的字节顺序
  • 可执行二进制文件(例如程序和共享库)的格式,以及它支持的内容类型
  • 在代码与系统之间传递数据的各种规范。这些规范包括对齐限制,以及系统调用时如何使用堆栈和寄存器。
  • 运行时可用于机器函数代码的符号列表 - 通常来自非常具体的库集

总结一下 ABI 的作用,就是在机器代码运行时,精确的定义机器代码如何与系统交互。因此必须为每个 CPU 架构指定 ABI

业务流程

上文了解到了 Android 常用的静态库与动态库的概念及区别,下面我们来总结一下 Android 动态库的加载流程

动态库(.so)的寻找流程

总结一下,流程图如图所示:


动态库(.so)的加载流程图

简单来说,就是先去默认目录(nativeLibraryDir)寻找。若没找到则去对应系统指定目录寻找。


麻烦点个喜欢,您的赞同 & 鼓励是我写作的最大动力!

你可能感兴趣的:(JNI 学习总结)