Java Native 方法和 JNI

JNI是什么

      JNI 的全称是 Java Native Interface, Java 程序通过调用JNI 调用非java语言编写的方法。JNI支持Java在不同平台的运行,只要操作系统配备本地存储JNI的dll文件,Java程序可以调用JNI。
      一般情况下JNI是由C和C++编写,因为C是面向过程语言,所以更加适合计算机底层逻辑,在相等的时间内,相同功能下,JNI的执行速率比java语言快。为了实现Java平台无关性,JNI对应不同的系统有不同的版本,这样java在执行的时候不用去考虑本地操作系统,而是由不同的ddl去匹配不同的操作系统,因为这个原因,JDK中并不包含ddl文件,而ddl文件则是存储在操作系统的ddl文件夹内。在windows32位操作系统中,这个路径是 C:\Windows\System32,在windows 64位系统中,ddl的存储路径是C:\Windows\SysWOW64 以及C:\Windows\System32。
Java Native 方法和 JNI

JNI的加载

        众所周知,java方法的加载是将字节码加载到java 虚拟空间中,这个被加载的字节码的入口维持一个该类的所有方法的列表,在这个list上,记载了此种方法的代码存储地,参数和方法的描述符,当调用某一个方法的时候,java可以通过查找这个List,得到代码存储地址,从而进行运行。
        如果一个方法描述符内有native字样,他不会在这个list中存储地址,而是存储一个指针,当程序调用相关的本地方法会通过指针找到相应的dll文件,加载dll文件到虚拟机中,如果没有找到dll文件,则会爆出无dll文件的系统错误。dll文件通过系统loadLibrary()或者load()方法加载,这两种方法的区别是loadLibrary()加载的时候会先找寻dependence.dll, 而load加载的时候需要先手工将dependence.dll 文件放入 java.library.path 的路径中。
Java Native 方法和 JNI

加载dll的方法

        目前java函数库共有三种方法可以加载dll,分别是JNI,Jawin和Jacob,后两者都是基于JNI所研发的技术,其中Jacob实现了加载Microsoft 中的com 类库的方法。

Native 方法的运行步骤

  1. 在Java 中声明Native() 方法并编译。
  2. 在javah中产生一个.h文件
  3. 基于dll文件,使用.cpp文件实现native的导出方法
  4. 编译 cpp文件使得器生成动态链接库文件
  5. 在Java中用System.loadLibrary()方法加载动态链接库文件,程序便可调用此native文件。