Java中如何調用VC的動態庫

以前一篇的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需要調用已有的動態庫,還需要自己生成一箇中間動態庫,負責調用轉換。所以效率就會有點低。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章