十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这篇文章将为大家详细讲解有关JNI本地接口如何在Java中使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
创新互联建站是一家专业提供白碱滩企业网站建设,专注与成都做网站、网站建设、H5高端网站建设、小程序制作等业务。10年已为白碱滩众多企业、政府机构等服务。创新互联专业网站建设公司优惠进行中。详解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 接口的组织类似于 C++ 虚拟函数表或 COM 接口。使用接口表而不使用硬性编入的函数表的好处是使 JNI 名字空间与平台相关代码分开。虚拟机可以很容易地提供多个版本的 JNI 函数表。例如,虚拟机可支持以下两个 JNI 函数表:
· 一个表对非法参数进行全面检查,适用于调试程序;
· 另一个表只进行 JNI 规范所要求的最小程度的检查,因此效率较高。
JNI 接口指针只在当前线程中有效。因此,本地方法不能将接口指针从一个线程传递到另一个线程中。实现 JNI 的虚拟机可将本地线程的数据分配和储存在 JNI 接口指针所指向的区域中。
本地方法将JNI 接口指针当作参数来接受。虚拟机在从相同的 Java 线程中对本地方法进行多次调用时,保证传递给该本地方法的接口指针是相同的。但是,一个本地方法可被不同的 Java 线程所调用,因此可以接受不同的 JNI 接口指针。
(1)编写Java类代码
其中,需要JNI实现的方法应当用native关键字声明。在该类中,用System.1oadLibrary()方法加载需要的动态链接库。关键代码如下:
//Compute.java public class Compute{ public native double sqrt(double params); static{ //调用动态链接库 System.loadLibrary(“compute”); }