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分析

    本文主要是自己对JNI学习的一个总结和笔记,如果错误的地方还请大神纠正 JNI简述 1:JNI 全称 Java N...

  • JNI 学习总结

    前言 在 Android 项目中,大家都会或多或少接触过 JNI。一般都是底层同事给出动态库 (.so) ,然后集...

  • jni学习总结

    一、jni是什么 java代码要使用native的代码,需要一个桥梁将他们连接起来,这个桥梁就是jni。 二、JN...

  • JNI学习总结(实践篇)

    前言 JNI学习总结(基础篇)里面总结了关于JNI和NDK的一些基本概念以及开发流程。本文中学习一下里面涉及到的具...

  • JNI学习记录1-初建JNI工程

    JNI学习记录1-初建JNI工程JNI学习记录2-local refence崩溃问题JNI学习记录3-String...

  • JNI学习记录2-local refence崩溃问题

    JNI学习记录1-初建JNI工程JNI学习记录2-local refence崩溃问题JNI学习记录3-String...

  • JNI学习记录5-Methods

    JNI学习记录1-初建JNI工程JNI学习记录2-local refence崩溃问题JNI学习记录3-String...

  • JNI学习记录3-String and Array

    JNI学习记录1-初建JNI工程JNI学习记录2-local refence崩溃问题JNI学习记录3-String...

  • JNI学习记录4-Fields

    JNI学习记录1-初建JNI工程JNI学习记录2-local refence崩溃问题JNI学习记录3-String...

  • Android jni 学习总结

    1. 为啥使用 jni jni 能够允许 Java 代码与 c/c++ 编写的应用程序和库进行交互,是将 Java...

网友评论

    本文标题:JNI 学习总结

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