以前一篇的DLL爲例闡述Java如何調用動態庫
目前存在一個VC編譯的非MFC動態庫DLL(具體如何生成非MFC動態庫DLL見前一篇文章),名稱爲mydll.dll,其中有導出函數myadd:形如:int myadd(int,int),現java應用程序需要調用該動態庫的myadd函數。具體實現步驟如下:
1、編寫調用mydll.dll的java程序
(1)程序testMyDll .java如下:
public class testMyDll {
private native static int myadd(int a,int b);
static {
System.loadLibrary("javamydll"); //該動態庫名稱爲中間動態庫,由java程序使用,負責調用需要使用的動態庫。
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(myadd(4,5));
}
}
(2)編譯testMyDll .java程序,檢查是否存在錯誤。
javac testMyDll .java
2、生成頭文件testMyDll.h,供生成中間動態庫使用。
javah testMyDll
3、生成中間動態庫javamydll.dll
(1)使用vc工具先生成win32 Dynamic-Link Library空工程
(2)將上面生成的頭文件testMyDll.h添加進去,同時還需要添加jdk下include目錄中 的jni.h、jni_md.h這兩個頭文件,最好將jni.h文件放入安裝目錄下include的目錄下
(3)添加調用需要使用的動態庫的實現文件testMyDll.cpp
程序如下:
//testMyDll.cpp
#include <windows.h>
#include "testMyDll.h"
typedef int (*padd)(int,int);
JNIEXPORT jint JNICALL Java_testMyDll_myadd
(JNIEnv * a, jclass b, jint x, jint y)
{
HINSTANCE hins = ::LoadLibrary("mydll.dll");
if(hins == NULL)
{
return 0;
}
int res;
padd pa = (padd)GetProcAddress(hins,"myadd");
if(pa != NULL)
{
res = x+y;
}
::FreeLibrary(hins);
return res;
}
(4)編譯生成中間動態庫javamydll.dll
4、將中間動態庫javamydll.dll和需使用的動態庫mydll.dll放在testMyDll.class目錄下,運行該類: java testMyDll
程序輸出結果:9
從上述實現方法中可以看到,java需要調用已有的動態庫,還需要自己生成一箇中間動態庫,負責調用轉換。所以效率就會有點低。