1. JNI概述
我们作为java程序员,但我们不得不承认java语言也有一些它本身的缺点。比如在性能、和底层打交道方面都有它的缺点。所以java就提供了一些本地接口,他主要的作用就是
提供一个标准的方式让java程序通过虚拟机与原生代码进行交互,这也就是我们平常常说的java本地接口(
JNI——java native Interface)。它使得在 Java 虚拟机(JVM) 内部运行的Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行互操作。JNI 最重要的好处是它没有对底层 Java 虚拟机的实现施加任何限制。
我们来看一下为什么要与原生代码进行交互:
一:提高应用程序性能。我们知道java对于c/c++、汇编语言来说,显得比较“高级”。其实这里的高级就是简化了程序员的工作。很多底层的东西都让java虚拟机做了。但毕竟相对于直接访问底层来讲,java多了一步虚拟机的过程,所以在性能上比着这些原生语言稍微有点慢。
二:实现一些与底层相关的功能。Java平台提供的标准类库,还有强大的API,虽然能完成大部分功能。但有些和底层硬件打交道的功能在java API提供的类库中还是无法完成。
三:与已有的使用原生代码编写的程序进行集成。在于操作系统上由c或者c++等原生语言编写的软件进行集成的时候,可以用JNI。
2. JNI的实现流程
3. JNI 接口函数和指针
平台相关代码是通过调用 JNI 函数来访问Java 虚拟机功能的。JNI 函数可通过接口指针来获得。接口指针是指针的指针,它指向一个指针数组,而指针数组中的每个元素又指向一个接口函数。每个接口函数都处在数组的某个预定偏移量中。下图说明了接口指针的组织结构。