Java通过jni调用动态链接库

时间:2022-03-21 15:51:16

(1)JNI简介

       JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少要保证本地代码能工作在任何Java 虚拟机环境。 简单的来说JNI就是方便了Java调用c,c++语言的函数;java通过JNI提供接口(头文件),c,c++实现这些函数供java调用。

()Java调用动态库的第一步:编写Java JNI接口代码如下

package com.xiaomo.jni;

public class JNIInterface {
static{
System.loadLibrary("JNITest");//这里的“JNITest”就是我们需要生成的dll本地动态链接库,书写库名就可以了,但是这个dll或则so文件必须在path的目录下,要不然会找不到
}
//这里我们需要给这个库提供接口函数
public native int add(int a,int b);//加法函数
public native int mis(int a,int b);//减法函数
}

  通过java c命令生成JNIInterface.class文件如下图所示:

Java通过jni调用动态链接库

这个时候会在相应的文件夹目录下生成.class文件如下图所示:

Java通过jni调用动态链接库

(2)通过javah 命令将JNIInterface编译成.h头文件,具体编译的时候需要包名.类名,如下图所示

Java通过jni调用动态链接库

通过编译后出现一个com_xiaomo_jni_JNIInterface.h的头文件,这个将相当于Java通过JNI提供给动态链接库的头文件

(3)第三步当然是在编写本地动态库的时候引入这个头文件,实现该头文件的方法。将编写好的JNITest.dll文件房子啊JRE的bin目录下,或者是JDK的bin目录下

(4)第四步,在java端实例化JNIInterface这个类,调用这个类的方法。具体的会遇到很多的问题,大多都是路径问题,生成的dll文件是32位,64位的问题。