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

简介: 本节书摘来自华章出版社《Android的设计与实现:卷I》——第2章,第2.1节。作者: 杨云君著.更多章节内容可以访问云栖社区“华章计算机”公众号查看。

第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所示。


image

从图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编程的三个步骤。

相关文章
|
21天前
|
Android开发
Android JNI与CAN通信遇到的问题总结
Android JNI与CAN通信遇到的问题总结
37 1
|
1月前
|
SQL 缓存 安全
Android ORM 框架之 greenDAO
Android ORM 框架之 greenDAO
37 0
|
5月前
|
JSON 前端开发 Android开发
Android MVI框架搭建与使用(上)
Android MVI框架搭建与使用(上)
126 0
|
22天前
|
Android开发
Android JNI 报错(signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr )
Android JNI 报错(signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr )
65 1
|
7天前
|
编解码 调度 Android开发
Android音频框架之一 详解audioPolicy流程及HAL驱动加载与配置
Android音频框架之一 详解audioPolicy流程及HAL驱动加载与配置
13 0
|
22天前
|
传感器 Java 开发工具
[NDK/JNI系列03] Android Studio集成NDK开发环境
[NDK/JNI系列03] Android Studio集成NDK开发环境
22 0
|
5月前
|
Java 开发工具 Android开发
OpenCV(一):Android studio jni配置OpenCV(亲测有效,保姆级)
OpenCV(一):Android studio jni配置OpenCV(亲测有效,保姆级)
180 0
|
2月前
|
Android开发
[Android jni] Bitmap与Mat对象的相互转换
[Android jni] Bitmap与Mat对象的相互转换
64 0
|
4月前
|
SQL 存储 数据库
Android数据库框架该如何选?
Android数据库框架该如何选?
80 0
|
5月前
|
存储 前端开发 API
Android MVI框架搭建与使用(下)
Android MVI框架搭建与使用(下)