这篇文章将为大家详细讲解有关JNI本地接口如何在Java中使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
<强>详解Java本地接口JNI使用方法强>
对于Java程序员来说,Java语言的好处和优点,我想不用我说了,大家自然会说出很多一套套的。但虽然我们作为Java程序员,但我们不得不承认Java语言也有一些它本身的缺点。比如在性能,和底层打交道方面都有它的缺点,所以Java就提供了一些本地接口,他主要的作用就是提供一个标准的方式让Java程序通过虚拟机与原生代码进行交互,这也就是我们平常常说的Java本地接口(JNI (Java native Interface)。它使得在Java虚拟机(VM)内部运行Java的代码能够与用其它编程语言(如C、c++和汇编语言)编写的应用程序和库进行互操作.JNI最重要的好处是它没有对底层Java虚拟机的实现施加任何限制,因此,Java虚拟机厂商可以在不影响虚拟机其它部分的情况下添加对JNI的支持。程序员只需编写一种版本的本地应用程序或库,就能够与所有支持JNI的Java虚拟机协同工作。我们来看一下为什么要与原生代码进行交互:
<强>一:提高应用程序性能。强>我们知道Java对于C/c++,汇编语言来说,显得比较“高级”。其实这里的高级就是简化了程序员的工作。很多底层的东西都让Java虚拟机做了。但毕竟相对于直接访问底层来讲,Java多了一步虚拟机的过程,所以在性能上比着这些原生语言稍微有点慢。
<强>二:实现一些与底层相关的功能强> . Java平台提供的标准类库,还有强大的API,虽然能完成大部分功能。但有些和底层硬件打交道的功能在Java API提供的类库中还是无法完成。
<强>三:与已有的使用原生代码编写的程序进行集成。强>在于操作系统上由C或c++等者原生语言编写的软件进行集0成的时候,可以用JNI。
<强> JNI接口函数和指针强>
,,,,平台相关代码是通过调用JNI函数来访问Java虚拟机功能的.JNI函数可通过接口指针来获得。接口指针是指针的指针,它指向一个指针数组,而指针数组中的每个元素又指向一个接口函数。每个接口函数都处在数组的某个预定偏移量中。下图说明了接口指针的组织结构。
,,,,,,,,,,,,,,,,,,//Compute.java 公共类计算{ 公共本地双sqrt(双参数); 静态{//调用动态链接库 System.loadLibrary(“计算”); }
,,(2)编译成字节代码
,,,在这个过程中,由于采用了本地关键字声明,Java编译器会忽视没有代码体的JNI方法部分只,,
,(3)生成相关JNI方法的头文件
,,,这个过程的实现一般是通过利用jlavah-jni *类生成的(JNI可以省略),也可以手工生成该文件;但是由于Java虚拟机是根据一定的命名规范完成对JNI方法的调用,所以手工编写头文件需要特别小心。
,,,上述文件产生的头文件部分代码如下:,
//Compute.h 外来的“C”{ JNIEXPORT jdoubleJNICALL Java_Compute_comp (JNI-Env *, jobject jdoubleArray);
,,,JNI函数名称分为三部分:首先是Java关键字,供Java虚拟机识别,然后是调用者类名称(全限定的类名,其中用下划线代替名称分隔符);最后是对应的方法名称,各段名称之间用下划线分割。