-
JNI介绍
1.1 简介
-
JNI的全称就是Java Native Interface,即java本地开发接口。可能大家和我一样,一听到接口什么的就犯懵:“我也知道这是java本地开发接口的意思,但它具体是个什么意思我还是搞不明白。”其实JNI它就是一种协议,一说协议,那它就是对某种东西的一个规范和约束,说的好听一点就是标准化。如果你想用我这个东西,那你必须要遵守我这边的规范。像http协议一样,http作为超文本传输协议,它规范了我们上网时从客户端到服务器端等一系列的运作流程。正因为如此,我们才能畅通无阻的上网。那么换做JNI也一样,只不过JNI这个协议是用来沟通java代码和外部的本地代码(c/c++)。也就是说有了JNI这个协议,我们才能够随意的让java代码调用C/C++的代码,同样C/C++的代码也可以调用java的代码。如果没有这个协议作为支撑,那么java和C/C++代码想要相互调用是不可能的。下面通过两个图简单看一下JNI协议在系统架构中处于什么位置:
在上图中,上层绿色的部分一般都是用Java代码写的,下层橘黄色的部分一般都是用C/C++代码写的。可以看出,正是由于有了中间JNI的存在我们才可以在Application层通过JNI调用下层中的一些东西。
-
作用: 使得
Java与 本地其他类型语言(如C、C++)交互即在
Java代码 里调用C、C++等语言的代码 或C、C++代码调用Java代码 -
特别注意:
-
JNI是Java调用Native语言的一种特性 -
JNI是属于Java的,与Android无直接关系
-
1.2 为什么要有 JNI
- 背景:实际使用中,
Java需要与 本地代码 进行交互 - 问题:因为
Java具备跨平台的特点,所以Java与 本地代码交互的能力非常弱 - 解决方案: 采用
JNI特性 增强Java与 本地代码交互的能力
1.3 实现步骤
- 在
Java中声明Native方法(即需要调用的本地方法) - 编译上述
Java源文件javac(得到.class文件) - 通过
javah命令导出JNI的头文件(.h文件) - 使用
Java需要交互的本地代码 实现在Java中声明的Native方法如
Java需要与C++交互,那么就用C++实现Java的Native方法 - 编译
.so库文件 - 通过
Java命令执行Java程序,最终实现Java调用本地代码
NDK介绍
2.1 简介
- 定义:
Native Development Kit,是Android的一个工具开发包NDK是属于
Android的,与Java并无直接关系 - 作用:快速开发
C、C++的动态库,并自动将so和应用一起打包成APK
即可通过NDK在Android中 使用JNI与本地代码(如C、C++)交互 -
应用场景:在Android的场景下 使用JNI
即
Android开发的功能需要本地代码(C/C++)实现 -
特点
- 额外注意
2.2 使用步骤
- 配置
Android NDK环境 - 创建
Android项目,并与NDK进行关联 - 在
Android项目中声明所需要调用的Native方法 - 使用
Android需要交互的本地代码 实现在Android中声明的Native方法比如
Android需要与C++交互,那么就用C++实现Java的Native方法 - 通过
ndk - bulid命令编译产生.so库文件 - 编译
Android Studio工程,从而实现Android调用本地代码