在java项目开发的时候,可能会涉及调用第三方的接口,而第三方的接口提供方式不一定是以java类的方式提供,如果是C或C++开发的第三方系统,则一般以动态链接库的方式提供,现在就讲一下java是如何调用动态链接库的。比较流行的方法有jni和jawin, 后者是开源组织提供的封装库,相对调用简单,不需要懂得C或C++的编程方式。这里主要描述jni的调用方式,需要对C或C++有一定了解。
开发环境:eclipse, visual studio 2010
举例说明:
如有一个动态库mathOper.dll,里面有一个运算方法
int Min(int a, int b);
这个方法是用来判断最小值的。因为java是不能直接调用这个方法,所以需要有个中间库来衔接java和mathOper.dll
第一步:定义这个中间库的名称为callMathOper,打开eclipse,新建一工程TestDll,定义类TestDll(名称任意),代码如下:
public class TestDll {
static {
System.loadLibrary("callMathOper");// 载入dll
}
public native static int Min(int a, int b);// 函数声明
}
第二步:打开cmd窗口,进入TestDll.class目录下,执行javah TestDll,在当前目录生成TestDll.h
第三步:打开visual studio,新建一项目callMathOper(这个就是中间库的名称),新建头文件TestDll.h,将第二步中生成的TestDll.h的内容copy到这个头文件里
第四步:选中该项目,右键"属性",修改配置
1.修改配置类型
2.加入jdk下的include目录,主要作用是引入jni.h这个头文件
第五步:在项目的源文件中新增一cpp文件callMathOper.cpp,加入如下代码:
#pragma comment(lib,"mathOper.dll.lib")
extern "C"_declspec(dllimport) int Min(int a,int b);
#include <stdio.h>
#include "TestDll.h"
JNIEXPORT jint JNICALL Java_TestDll_Min(JNIEnv *, jclass _cls, jint a, jint b){
int result = Min(a,b);
return result;
}
第六步:右键“生成”,产生callMathOper.dll,将callMathOper.dll和mathOper.dll拷到java工程TestDll根目录下,在TestDll类中加入main方法,进行测试:
public static void main(String[] args) {
TestDll td = new TestDll();
System.out.println(td.Min(123, 125));
}
看能否正常运行及输出结果是否正确。