《Android的设计与实现:卷I》——第2章 框架基础JNI

    xiaoxiao2021-07-07  241

    第2章 框架基础JNI

    JNI(Java Native Interface,Java本地接口)是Java平台上定义的一套标准的本地编程接口。JNI允许Java代码与本地代码互操作,即Java代码可以调用本地代码,本地代码也可以调用Java代码。所谓本地代码指的是用其他编程语言(如C/C++)实现的、依赖于特定硬件和操作系统的代码。通过JNI调用本地代码,可以实现Java语言所不能实现的功能。在Android平台上,Dalvik虚拟机会实现JNI定义的接口。

    2.1 JNI在Android系统中所处的位置

    Android采用分层的体系结构:上层的应用层和应用框架层主要使用Java语言开发;下层则运行一个Linux内核,并在内核之上集成了各种核心库和第三方库,以提供系统运行所需的服务,这部分是用C和C++语言开发。连接这两部分的纽带就是JNI。JNI在Android系统中所处的位置如图2-1所示。

    从图2-1中可以看出,JNI可以直接调用本地代码库,并可以通过Dalvik虚拟机实现与应用层和应用框架层之间的交互。Android JNI部分的代码主要位于Android体系结构中的上面两层:

    应用层:采用NDK开发,主要使用标准JNI编程模型实现。

    应用框架层:Android定义了一套JNI编程模型,使用函数注册方式弥补了标准JNI编程模型的不足。

    Android应用框架层JNI部分源码主要位于frameworks/base/目录下。按照模块组织,不同的模块将被编译为不同的共享库,分别为上层提供不同的服务。这些共享库最终会被放置在目标系统的/system/lib目录下。

    注意 NDK与JNI的区别: NDK是为便于开发基于JNI的应用而提供的一套开发和编译工具集;而JNI则是一套编程接口,可以运用在应用层,也可以运用在应用框架层,以实现Java代码与本地代码的互操作。

    JNI编程模型的结构十分清晰,可以概括为以下三个步骤:步骤1 Java层声明Native方法。步骤2 JNI层实现Java层声明的Native方法,在JNI层可以调用底层库或者回调Java层方法。这部分将被编译为动态库(SO文件)供系统加载。步骤3 加载JNI层代码编译后生成的共享库。JNI的很多概念比较模糊,为了不引起歧义,这里规定本书中的涉及名词的含义。

    native:特指Java语言中的方法修饰符native。

    Native方法:特指Java层中声明的、用native修饰的方法。

    JNI层:特指采用JNI技术实现Java层声明的Native方法的部分。

    JNI函数:特指JNIEnv提供的函数。

    JNI方法:特指Native方法对应的JNI层实现方法。

    了解了JNI的主要概念和基本结构,下一节将以一个实例详细分析JNI编程的三个步骤。


    最新回复(0)