织梦 图片网站源码,软文推广500字,沈阳家用电梯公司网站制作,怎么编写一个网站一、JNI简介
JVM本地方法接口#xff08;Java Native Interface#xff0c;JNI#xff09;是一种允许Java代码调用本地方法#xff08;如C或C编写的方法#xff09;的机制。这种技术通常用于实现高性能的计算密集型任务#xff0c;或者与底层系统库进行交互。 二、JNI组… 一、JNI简介
JVM本地方法接口Java Native InterfaceJNI是一种允许Java代码调用本地方法如C或C编写的方法的机制。这种技术通常用于实现高性能的计算密集型任务或者与底层系统库进行交互。 二、JNI组成 Java类中的native方法在Java类中使用native关键字声明一个本地方法表示该方法将由本地代码实现。 JNI头文件使用Java Native Interface工具javac、javah生成本地方法的头文件该头文件中包含了本地方法的声明和参数列表等信息。 本地代码实现根据生成的头文件在本地代码中实现对应的本地方法。可以使用C、C等语言编写本地代码并通过编译器将其编译成动态链接库DLL或共享库SO。
三、JNI的作用 提高性能通过将计算密集型任务交给本地代码实现可以提高程序的性能。因为本地代码可以直接操作内存和硬件资源而不需要经过Java虚拟机的额外开销。 与底层系统库交互JNI可以方便地与底层系统库进行交互例如访问操作系统、数据库、网络等资源。 扩展Java功能通过JNI可以将其他编程语言的功能集成到Java程序中从而扩展Java的功能。
四、本地方法
简单来讲一个Native Method就是一个Java调用非Java代码的接口。一个Native Method是这样一个java方法该方法的实现由非Java语言实现比如C。这个特征并非Java特有很多其他的编程语言都有这一机制比如在C 中你可以用extern “C” 告知C 编译器去调用一个C的函数。
在定义一个native method时并不提供实现体有些像定义一个Java interface因为其实现体是由非java语言在外面实现的。
本地接口的作用是融合不同的编程语言为Java所用它的初衷是融合C/C程序。
标识符native可以与所有其它的java标识符连用但是abstract除外。这是合理的因为native暗示这些方法是有实现体的只不过这些实现体是非java的但是abstract却显然的指明这些方法无实现体。native与其它java标识符连用时其意义同非Native Method并无差别比如native static表明这个方法可以在不产生类的实例时直接调用这非常方便比如当你想用一个native method去调用一个C的类库时。上面的第三个方法用到了native synchronizedJVM在进入这个方法的实现体之前会执行同步锁机制就像java的多线程。
一个native method方法可以返回任何java类型包括非基本类型而且同样可以进行异常控制。这些方法的实现体可以制一个异常并且将其抛出这一点与java的方法非常相似。当一个native method接收到一些非基本类型时如Object或一个整型数组时这个方法可以访问这非些基本型的内部但是这将使这个native方法依赖于你所访问的java类的实现。有一点要牢牢记住我们可以在一个native method的本地实现中访问所有的java特性但是这要依赖于你所访问的java特性的实现而且这样做远远不如在java语言中使用那些特性方便和容易。
native method的存在并不会对其他类调用这些本地方法产生任何影响实际上调用这些方法的其他类甚至不知道它所调用的是一个本地方法。JVM将控制调用本地方法的所有细节。需要注意当我们将一个本地方法声明为final的情况。用java实现的方法体在被编译时可能会因为内联而产生效率上的提升。但是一个native final方法是否也能获得这样的好处却是值得怀疑的但是这只是一个代码优化方面的问题对功能实现没有影响。
如果一个含有本地方法的类被继承子类会继承这个本地方法并且可以用java语言重写这个方法这个似乎看起来有些奇怪同样的如果一个本地方法被fianl标识它被继承后不能被重写。
本地方法非常有用因为它有效地扩充了jvm.事实上我们所写的java代码已经用到了本地方法在sun的java的并发多线程的机制实现中许多与操作系统的接触点都用到了本地方法这使得java程序能够超越java运行时的界限。有了本地方法java程序可以做任何应用层次的任务。 五、使用native method
1. 与Java环境外交换
需要和Java外面的环境进行交互这是本地方法存在的主要原因。比如和操作系统或者某些硬件交换信息时本地方法就为我们提供了方便简洁的接口。
2. 与操作系统交互
通过使用本地方法Java实现了JRE与底层系统的交互甚至JVM的一部分就是使用 C 写的。另外如果我们要使用Java未提供的封装的操作系统的特性时也需要使用到本地方法。就像Java创建的线程最终还是要回归到操作系统的本地线程。
3. Sun’s Java
Sun的解释器是用 C 实现的使得它能像一些普通的 C 一样与外部交互。例如类 java.lang.Thread 的 setPriority() 方法是通过java 实现的但是它实际调用的是该类里的本地方法 setPriority0()。 六、JNI源码解读
JNI源码解读主要包括以下几个部分 JNI头文件包含JNI函数声明和结构体定义。例如jintArray、jbooleanArray等类型的声明。 JNI函数实现这些函数是在C或C中实现的它们提供了与JNI头文件中声明的函数对应的本地方法。例如GetStringUTFChars、ReleaseStringUTFChars等函数。 JNI函数指针这些指针指向JNI函数实现。在Java代码中可以使用这些指针来调用本地方法。 Java类和方法这些类和方法用于在Java代码中声明本地方法。例如public native void nativeMethod();表示一个本地方法。 加载和链接本地库在Java程序启动时需要加载包含本地方法实现的本地库。然后JVM会将这些本地方法与Java类和方法关联起来。
以下是一个简单的JNI源码示例 #include jni.h
#include HelloJNI.h
#include stdio.hJNIEXPORT jstring JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject obj) {return (*env)-NewStringUTF(env, Hello from C!);
}在这个示例中我们实现了一个名为sayHello的本地方法它返回一个字符串Hello from C!。要使用这个本地方法需要在Java代码中声明它 public class HelloJNI {static {System.loadLibrary(hello-jni);}public native String sayHello();public static void main(String[] args) {HelloJNI hello new HelloJNI();String result hello.sayHello();System.out.println(result);}
}
编译并运行这个Java程序将看到输出Hello from C!。 七、结语
目前该方法的使用越来越少了除非是与硬件有关的应用比如通过java程序驱动打印机或者java系统管理生产设备在企业级应用已经比较少见。因为现在的异构领域间的通信很发达比如可以使用Socket通信也可以是用Web Service等等。
需要注意的是由于本地方法可能会破坏Java的安全性和可移植性因此在使用JNI时需要谨慎操作。此外虚拟机保证在同一Java线程中多次调用同一本地方法时传递给该本地方法的JNI接口指针是相同的。