以下是我個人的經驗
雖然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所撰寫的心得)
因篇幅问题不能全部显示,请点此查看更多更全内容