Java調用DLL的技術

Java語言本身具有跨平臺性,如果通過Java調用DLL的技術方便易用,使用Java開發前臺界面可以更快速,也能帶來跨平臺性。

Java調用C/C++寫好的DLL庫時,由於基本數據類型不同、使用字節序列可能有差異,所以在參數傳遞過程中容易出現問題。

使用Java調用DLL動態鏈接庫的方案通常有三種:JNI, Jawin, Jacob. 其中JNI(Java Native Interface)是Java語言本身提供的調用本地已編譯的函數庫的方法,本身具有跨平臺性,可以在不同的機器上調用不同的本地庫。Jawin和Jacob都是sourceforge.net的開源項目,都是基於JNI技術的依賴Windows的實現,使得在Windows平臺下使用COM和DLL的更加方便。
Jni程序開發的一般操作步驟如下:
1. 編寫java中的調用類,並用javac 包名.*.java 命令 得到該調用類的class文件
2. 用javah 包名.* 生成c/c++原生函數的頭文件
3. c/c++中調用需要的其他函數功能,實現原生函數(原則上可以調用任何資源)
4. 將項目依賴的所有原生庫和資源加入到java項目的java.library.path
5. 生成java調用類對應的dll庫
6. 發佈java應用和dll庫
 
 
l Jni程序開發示例:
1、 在eclipse項目中新建一個TestHello.java,輸入以下內容:
    public class TestHello { 
     static { 
      System.loadLibrary("TestHello");//加載名爲TestHello.dll的動態鏈接庫文件 
     } 
    //本地方法聲明 
     public static native void hello(String msg); 
      
     public static void main(String[] args) { 
      
    //本地方法的調用 
      hello("Hello,Kimm!"); 
      
     } 
    } 


編譯生成TestHello.class文件。
2、 在命令行下使用javah TestHello命令,生成TestHello.h頭文件(就是jni代理stub的接口)。
3、 在VC6中新建一個項目TestHello, 項目類型爲Win32 Dynamic-Link Library。點擊OK。

在彈出的窗口中選擇A simple DLL project,點擊Finish。

打開項目所在的文件目錄,將步驟2中生成的TestHello.h文件複製到此目錄。點擊左邊中間的FileView,切換到文件瀏覽模式。在Header Files上點擊右鍵,選擇Add Files to Folder…。
選擇TestHello.h文件,點擊OK。

打開StdAfx.h文件,再最後面添加:
#include <jni.h>
#include "TestHello.h"
 
打開TestHello.cpp文件,在最後面添加一段代碼:
JNIEXPORT void JNICALL Java_TestHello_hello(JNIEnv * env, jclass obj, jstring jMsg)
{
 const char *strMsgPtr = env->GetStringUTFChars( jMsg , 0);
 
 MessageBox( 0, strMsgPtr,"Message box from VC++ ", 0 );
 
 env->ReleaseStringUTFChars( jMsg, strMsgPtr);
 
}
 
在VC的菜單上選擇Tools-Options…,打開選項對話框。在Directories文件夾,添加上jdk所在文件夾下的include和include\win32文件夾。
 
點擊VC上的菜單項Build-Build All,生成TestHello.dll。或者在在Header Files上點擊右鍵,選擇Add Files to Folder分別找到jdk目錄下的文件:如以我jdk目錄爲例,把C:\Program Files\Java\jdk1.6.0\include\jni.h、C:\Program Files\Java\jdk1.6.0\include\win32\jni_md.h這連個頭文件導入也是同樣效果
 
4、 將VC項目Debug文件夾中的TestHello.dll複製到TestHello.class所在的文件夾下。
 
如果出現以下異常說明:java.library.path沒有設置或者設置不正確
Exception in thread "main" java.lang.UnsatisfiedLinkError: no TESTHello in java.library.path
  at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1682)
  at java.lang.Runtime.loadLibrary0(Runtime.java:823)
  at java.lang.System.loadLibrary(System.java:1030)
 
不過以上異常也無所謂,我們只需把TestHello.h放到C:\WINDOWS\system32目錄下就可以了,系統會自動找到這個dll的
 
C:\WINDOWS\system32
5、 在命令行下輸入java TestHello,彈出MessageBox對話框。調用win32 api成功。


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