Java使用JNI调用第三方dll动态链接库
项目中应用到java调用第三方dll的问题,于是搜寻资料学习了一下;本文仅流于如何使用的层面,未对更深层次实现做探究。
使用Java调用DLL动态链接库的方案通常有三种:JNI, Jawin, Jacob.
其中JNI(Java Native Interface)是Java语言本身提供的调用本地已编译的函数库的方法,本身具有跨平台性,可以在不同的机器上调用不同的本地库。
JNI
JNI是Java Native Interface的缩写。从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。
3. 使用javah -jni产生头文件
4. 用本地代码实现头文件中定义的方法,将编译生成的dll文件及lib文件复制到java类所在目录中
5. Run
class Test1{
static{
System.loadLibrary("MyDLL");
}
public native int getSum(int a, int b);
public native void displayResult(int c);
public static void main(String[] args){
int a = 1;
int b = 5;
int c = 0;
Test1 test1 = new Test1();
c = test1.getSum(a,b);
test1.displayResult(c);
}
}
2.进入该类所在目录,javac Test1.java
3.javah Test1 生成Test1.h。注:-jni是默认参数,可不写。内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Test1 */
#ifndef _Included_Test1
#define _Included_Test1
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Test1
* Method: getSum
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_Test1_getSum
(JNIEnv *, jobject, jint, jint);
/*
* Class: Test1
* Method: displayResult
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_Test1_displayResult
(JNIEnv *, jobject, jint);
#ifdef __cplusplus
}
#endif
#endif
4.将jdk安装路径下 三个文件复制到 Visual Studio.net的安装目录下的\Vc7\include目录中
注:版本不同,可自己找到相应目录即可
\jdk\include\jni.h
\include\win32\jawt_md.h
\jdk\include\win32\jni_md.h
打开VC++,新建一个DLL工程,选择空项目,命名为MyDLL。
将Test1.h添加到项目Header Files下。
新建Test1.cpp,根据Test1.h实现相应函数。内容如下
#include<jni.h>
#include"Test1.h"
#include<stdio.h>
JNIEXPORT jint JNICALL Java_Test1_getSum(JNIEnv *, jobject, jint a, jint b){
jint c = a + b;
return c;
}
JNIEXPORT void JNICALL Java_Test1_displayResult(JNIEnv *, jobject, jint c){
printf("%d\n",c);
return;
}
编译生成MyDLL.dll及MyDLL.lib,将其复制到Test1.java所在目录中
5.dos下 java Test1
本文部分内容参考:

浙公网安备 33010602011771号