JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 技巧文件  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 Java與其他語言的結合(Java、C和jython)
newworld





發文: 3
積分: 1
於 2003-12-31 22:56 user profilesend a private message to usersend email to newworldreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
PART1

雖然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
2
3
4
5
6
7
8
9
10
11
12
13
14
class HelloWorld { 
   public native void displayHelloWorld();  
   /*上方的native型態是通知Java這個函數會使用到外部函數 */
 
   static { 
      System.loadLibrary("hello"); 
      /*上方的程式碼代表我要載入hello.dll的動態連結,hello.dll的製作我在
         稍後會做介紹 */
   } 
 
   public static void main(String[] args) { 
      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
2
3
4
5
6
7
8
9
10
#include 
#include "HelloWorld.h" 
#include 
 
JNIEXPORT void JNICALL 
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) 
{ 
   printf("HelloWorld"); 
   return; 
} 


程式碼如下(HelloWorld.h)
1
2
3
4
5
6
7
8
9
10
11
12
13
/* DO NOT EDIT THIS FILE - it is machine generated */ #include 
/* Header for class HelloWorld */ 
#ifndef _Included_HelloWorld 
#define _Included_HelloWorld 
#ifdef __cplusplus extern "C" { #endif 
/* 
  * Class: HelloWorld 
  * Method: displayHelloWorld 
  * Signature: ()V 
*/ 
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject); 
#ifdef __cplusplus } #endif 
#endif 


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

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

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

PART2

經過之前的練習我們已經會利用Java的JNI將c包在Java中,利用c語言所撰寫的dll將Java程式與c結合起來,我們只要會撰寫Java程式,而不必去理會dll檔到底做了什麼事,我們只要懂得呼叫使用dll檔一樣可以將程式寫的很好。

但這並非我的最終目的,我希望我能利用python程式在將java程式再做一層包裝,因此使用了jpython這個語言,jpython是以Java實作的一個python語言,這個語言保有和python語言相同的簡單與便利的特性,只不過它是架設在Java的虛擬機器之上,所以許多有關作業系統方便處理的函數都無法使用

jpython的語法就是python語言,對於熟悉python的人應該很容易上手,比較特別的是它能夠將java所撰寫而成的*.class import到自己的函式庫中做使用,它不但可以使用原本在python中所存在的函式庫,更可以取用Java的函式庫,而透過java我們又可以和c語言溝通,我們也可以和prolog語言溝通,似乎已經達到語言無障礙的地步,程式的地球村好像就要實現。

以前是在同一種語言中做包裝,在C、java中使用物件導向的程式設計,包成許許多多的類別,現在我發現一件事,我們似乎可以對語言做包裝,函數並不一定同一種語言去實作,因為每個人的背景不同,習慣熟悉使用的語言不同,在專案開發中強迫每個成員使用同一種語言或許比較容易整合,但開發速度不一定快,只有在每一個人使用它所習慣的語言來開發才能達到事半功倍的效果。

(Java的JNI與c接軌的方式我在之前的文章中已經做了詳細的介紹,在此不重複)

python語言的介紹http://www.python.org/
ython語言的介紹http://www.jython.org/

我簡單的說明一下我的做法:
dll檔使用之前已經編譯好的hello.dll,所使用的類別檔HelloWorld.class(之前編譯好的)
安裝Jython目前是2.1版
裝完之後你可以先玩玩看(假設你是裝在c:\jython21下)
c:\jython21>jython
它會先做出始化,並設定Java的環境,之後出現>>>的提示符號代表你可以開始動作

你可以先試試python原本的一些功能,例:
1.你在提示訊息(>>>)下鍵入數學運算2+3則答案是5
>>> 2+3
5
>>>
2.如果你鍵入負數運算2*(2j+3)則答案是(6+4j)
>>> 2*(2j+3)
(6+4j)
>>>
如果你想要印出Hello則直接鍵入print "Hello"
>>> print "Hello"
Hello
>>>

環境設定
在c:\jython21下建一個目錄叫JavaLib(名字隨便取),然後將hello.dll和HelloWorld.class複製到此目錄下,然後設定你的環境變數,Path和CLASSPATH都增加c:\jython21\JavaLib
測試執行
>>>import HelloWorld ←左邊這一句話是將HelloWorld.class類別引入使用
成功之後應該會出現>>>提示訊息,等候你輸入下一個指令,如果不成功請檢查一下HelloWorld.java內容是否正確,記得此類別必須為一個公開類別public class HelloWorld{...},修正完畢重新產生HelloWorld.class
>>>test=HelloWorld() ←左邊這一句話相當於test=new HelloWorld();
接著應該會出現>>>提示訊息
>>>test.displayHelloWorld()
>>>HelloWorld
如果出現HelloWorld代表成功了

根據專家指出利用java搭配jython來開發你的專案可以使開發的速度大大提升,因為jython的語法簡單,用短短的描述即可達成很多工作,最後更神奇的好像在jython中可以將它本身結合java的程式碼組譯成新的.class檔提供java vm使用,他本身也提供.jar檔讓你能夠直接在Java中享用jython的便利


newworld edited on 2003-12-31 23:23
reply to postreply to post
» JWorld@TW »  Java 技巧文件

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8