JNI本地接口如何在Java中使用

  介绍

这篇文章将为大家详细讲解有关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函数可通过接口指针来获得。接口指针是指针的指针,它指向一个指针数组,而指针数组中的每个元素又指向一个接口函数。每个接口函数都处在数组的某个预定偏移量中。下图说明了接口指针的组织结构。

,,,,,,,,,,,,,,,,,, JNI本地接口如何在Java中使用“> </p> <p>,,,,,,,,,,JNI接口的组织类似于c++虚拟函数表或COM接口。使用接口表而不使用硬性编入的函数表的好处是使JNI名字空间与平台相关代码分开。虚拟机可以很容易地提供多个版本的JNI函数表。例如,虚拟机可支持以下两个JNI函数表:<br/> </p> <p>·一个表对非法参数进行全面检查,适用于调试程序;<br/> </p> <p>·另一个表只进行JNI规范所要求的最小程度的检查,因此效率较高。<br/> </p> <p> JNI接口指针只在当前线程中有效,因此,本地方法不能将接口指针从一个线程传递到另一个线程中。实现JNI的虚拟机可将本地线程的数据分配和储存在JNI接口指针所指向的区域中。</p> <p>虚拟机在从相同的Java线程中对本地方法进行多次调用时,保证传递给该本地方法的接口指针是相同的。但是,一个本地方法可被不同的Java线程所调用,因此可以接受不同的JNI接口指针只,,,,,,,,,,,,,,,,,,,,<br/> </p> <p> <img src=//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虚拟机识别,然后是调用者类名称(全限定的类名,其中用下划线代替名称分隔符);最后是对应的方法名称,各段名称之间用下划线分割。

JNI本地接口如何在Java中使用