首页 养生问答 疾病百科 养生资讯 女性养生 男性养生
您的当前位置:首页正文

JAVA调用DLL(例子二)

2023-04-12 来源:华佗健康网
JAVA调用DLL(例子二) 2008-08-19 13:01 JNI的研究

以下是我個人的經驗

雖然JAVA的程式都必須在JAVA的虛擬機器上執行,但是我們可以在這部機器中打一個洞,讓JAVA程式可以直接溝通實際的機器

JNI是一種讓JAVA程式可以外接外部程式的一種機制,讓JAVA程式更具有擴充性,下面將示範一個簡單的範例,這個範例中說明JAVA程式如何與C語言接軌,事實上昨天所談的Prolog就是利用這種方式使Java程式可以使用prolog,透過dll和native的方式來達成這項任務,經過這樣的測試與實驗之後讓我不得不佩服java這個程式語言

你不需要擔心程式方面的問題,因為底下的程式架構都相當簡單,主要只是讓我們體驗一下

工具介紹:我將使用visual c++ 6.0來製作dll,使用java sdk 1.4來編譯我的java

java部分的實作

程式碼如下(HelloWorld.java):

1 class HelloWorld {

2 public native void displayHelloWorld();←左方的native型態是通知3 Java這個函數會使用到外部函數 4

5 static {

6 System.loadLibrary(\"hello\"); ←左方的程式碼代表我要載入hello.dll7 的動態連結,hello.dll的製作我在稍後會做介紹 8 } 9

10 public static void main(String[] args) { 11 new HelloWorld().displayHelloWorld(); }

}

當你完成上述的程式之後,將這個程式存檔為'HelloWorld.java'先用'javac HelloWorld.java'這個指令將它組譯成HelloWorld.class,然後使用'javah HelloWorld'產生HelloWorld.h,在HelloWorld.h中我們知道我們要實作一個函數Java_HelloWorld_displayHelloWorld(JNIEnv *, jobject); 接下來我將介紹如何完成這個函數

實作生平的第一個dll,在之前知道在windows和linux下有一種叫dll,動態連結的機制,但是一直不曉得到底它是怎麼做的,今天將要實作第一個這樣的東西 我會盡量將東西描述清楚,因為這是我第一次的經驗

首先啟動visual c++ 6.0,在檔案中選擇新增,然後在project中選擇Win32 Dynamic-Link Library這個選項,然後填寫你專案的名稱'hello',按下'Ok',請選擇An empty Dll project這一選項,然後按'Finish'再按下'Ok',我們要從頭開始。

經過上述動作之後我們就會得到一個空的專案資料,然後我們需要增加一些程式到我們的專案中,在這之前我們先處理好我們的.h檔,首先先到你安裝java JDK的目錄下找到include的資料夾,為了以後撰寫程式方便,將這個目錄下的所有檔案複製一份到你安裝visual c++ 6.0目錄下VC98\\Include裡面,預設路徑為C:\\Program Files\\Microsoft Visual Studio\\VC98\\Include,將資料複製到此資料夾中,並將原本放在win32中的jawt_md.h和jni_md.h複製一份至C:\\Program Files\\Microsoft Visual Studio\\VC98\\Include

完成這些前置動作之後,再來將我們剛剛產生的HelloWorld.h加入我們的Header Files中,並新增一個.c的檔案HelloWorldImp.c,然後到上方的功能表中Build選則'Build hello.dll',然後你將會得到一個hello.dll在專案目錄下的Debug\\hello.dll,到此為止,如果順利你應該的到dll檔

程式碼如下(HelloWorldImp.c):

1 #include

2 #include \"HelloWorld.h\" 3 #include

4

5 JNIEXPORT void JNICALL

6 Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) 7 {

8 printf(\"HelloWorld\"); 9 return; 10 }

程式碼如下(HelloWorld.h)

1 /* DO NOT EDIT THIS FILE - it is machine generated */ #include 2 /* Header for class HelloWorld */ #ifndef _Included_HelloWorld 3 #define _Included_HelloWorld

4 #ifdef __cplusplus extern \"C\" { #endif 5 /*

6 * Class: HelloWorld

7 * Method: displayHelloWorld 8 * Signature: ()V 9 */

10 JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld 11 (JNIEnv *, jobject); 12 #ifdef __cplusplus } #endif #endif

然後將hello.dll和HelloWorld.class放在同一個目錄下,執行java HelloWorld,出現列印HelloWorld在畫面上的結果

以上這是一個小小的範例,目的只是在做一個小小的實驗,因為沒有一個人會因為要列印一串自救去呼叫C語言來幫你做事,而會直接使用System.out.print(\"HelloWorld\"),比較快一點

透過以上這個小實驗讓我們知道java和c之間是有辦法互通的,因此或許java可以透過這個方式與作業系統之間有更密切的互動

[註]以上資料出自於

http://140.129.25.117:8000/swpweb/mycalendar.py?who_calendar=mycalendar,這是我個人的研究心得報告,剛好我有研究到這個所以就將文章放到這邊與大家分享(檔案位置2003年12月26所撰寫的心得)

因篇幅问题不能全部显示,请点此查看更多更全内容