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
本文部分内容参考: