JNI 学习总结

作者: 0xCAFEBOY | 来源:发表于2019-05-21 10:05 被阅读1047次

    前言

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

    阅读本文大概需要 2 分钟

    目录

    目录

    概念

    静态库 & 动态库

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

    区别总结

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

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

    对于动态库来说:

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

    ABI

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

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

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

    业务流程

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

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

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


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

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


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

    相关文章

      网友评论

        本文标题:JNI 学习总结

        本文链接:https://www.haomeiwen.com/subject/vhkdzqtx.html