摘要:對J2ME規範的內容以及與其它版本的關係進行了簡要介紹,並結合摩托羅拉的SDK講解了如何用KJava編寫應用程式。
關鍵字:KJava;J2ME;移動資訊裝置
摩托羅拉A6288、388型手機的登場,伴隨著一個亮點:自身帶有Kjava虛擬機器(KVM),能夠通過多種方式下載且能夠運行使用者用Kjava編寫的符合MIDP1.0規範的應用程式。後來,又有多款手機支援Kjava。實際上,Kjava不僅能夠為A6288等手機編寫應用程式,而且還可以為其它一些移動資訊裝置編寫應用程式。這類嵌入式程式和一般的Java程式相比,有它的特殊之處,本文將對Kjava及其應用進行介紹。
1.KJava簡介
Java語言最初是為嵌入式系統設計的一項產品,在Java 2中為了區分各種不同的應用,又細分成了Java 2 Enterprise Edition(J2EE)、Java 2 Standard Edition(J2SE)和Java 2 Micro Edition(J2ME)三種版本,其中J2ME又稱作Kjava。
在J2SE中,它定義了Java規範的核心類函數庫(即Java.*)和擴充類函數庫(即Javax.*),它主要定位在用戶端的應用程式。J2EE主要定位於伺服器端的應用程式,它除了支援J2SE所定義的核心類函數庫之外,還增加了一些擴充函數類庫,如支援Serverlet/JSP的javax.servlet.*等。J2ME只支援J2SE所定義的核心函數類庫的一部分,此外,在J2ME中還增加了一些支援嵌入式系統的擴充類函數庫,如javax.microedition.*等。
同樣是嵌入式裝置,它們在運算能力、電力供應等方面還是有很大的差別。Connected Limited Device Configuration(CLDC)規範描述的就是那些運算能力有限、電力供應有限的嵌入式裝置,如手機等;而Connected Device Configuration(CDC)規範則描述的是像電視機頂盒這樣運算能力較強、電力供應充足的系統。J2ME分別支援這兩種不同的配置。在同一種配置下,J2ME又通過Profile來定義與特定嵌入式裝置相關的擴充類函數庫。
在傳統的Java環境中,為了防止程式在傳送途中被篡改以及其它一些安全上的考慮,當程式被類別載入器載入後,緊接著要進行Byte Code審核,審核通過以後才允許Java虛擬機器執行它。這一操作在PC機上執行從速度上來看沒有什麼問題,但是在CLDC所描述的這類系統中,要想作完全相同的處理,從處理能力和速度上來看就顯得有些力不從心了。為瞭解決這個問題,程式設計人員需要在程式設計結束之後額外再多做一件事:預先審核。通過預先審核,會在最終的類檔案中加入一些特殊的符號,當該程式下載到目標平台上去執行時,可以以較快的速度完成審核操作。
2. Motorola SDK
下面以摩托羅拉A6288型手機為例來具體講解Kjava的程式設計。
在摩托羅拉A6288中使用了兩顆CPU,一顆是Dragon Ball VZ 33MHz,用於個人數文書處理,另外一顆用於通訊的處理。系統為使用者預留了約1M的記憶體空間,支援符合MIDP 1.0規範的Kjava應用程式。我們可以到摩托羅拉的官方網站去下載開發工具:CodeWarrior(試用版),下面的內容就是基於這一開發工具。
在CodeWarrior中,它包含了摩托羅拉的SDK,它實現了CLDC和MIDP 1.0。它所實現的CLDC類庫有java.io.*、java.lang.*、java.util.*和javax.microedition.io.*,實現的MIDP類庫有javax.microedition.lcdui.*、javax.microedition.rms和javax.micromedition.midlet。
我們在PC環境下編寫的嵌入在瀏覽器中的Java程式叫做Applet,編寫的程式必須要從Applet類擴充自己的類。而為手機這類移動資訊裝置編寫的Kjava程式叫做MIDlet,程式必須要從MIDlet類擴充自己的類。一個MIDlet程式具備如下的典型結構:
public class HelloWord extends MIDlet { HelloWord() {……}public void startApp() {……} public void pauseApp() {……} public void destroyApp(boolean unconditional) {……} } |
當程式被啟動時,startApp()被系統調用。(當程式剛開始運行時有啟動過程,程式被暫停後也可以被再次啟動)。當程式被暫時停止運行時,pauseApp()被調用。當程式執行結束時destroyApp()被調用。我們可以根據實際情況在各函數中進行相應的處理。
在摩托羅拉SDK中沒有AWT或者SWING,因為它們的實現會耗費太多的資源,摩托羅拉SDK只是在javax.microedition.lcdui中實現了基於LCD的一些比較簡單的設計使用者介面的功能。SDK中定義了各種Displable類(如Form),程式中當前顯示的畫面必須是某個Displable的執行個體,在該執行個體中可以再放置按鈕、文本編輯框、單選框等UI。
3. 舉例
下面是用Kjava編寫的一個可以在A6288型手機上啟動並執行簡單的例子。具體程式如下:
import java.io.*; import javax.microedition.lcdui.*; import javax.microedition.midlet.*;public class HelloWorld extends MIDlet implements CommandListener { private MainCanvas myCanvas; private Display myDisplay; private Command c1,c2,c3; HelloWorld() { myCanvas=new MainCanvas(); myCanvas.addCommand(c1=new Command("First",Command.SCREEN,1)); myCanvas.addCommand(c2=new Command("Second",Command.SCREEN,1)); myCanvas.addCommand(c3=new Command("Third",Command.SCREEN,1)); myCanvas.setCommandListener(this); myDisplay = Display.getDisplay(this); myDisplay = Display.getDisplay(this); } public void startApp() throws MIDletStateChangeException { myCanvas.setUp("first"); myDisplay.setCurrent(myCanvas); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } public void commandAction(Command c,Displayable d) { myCanvas.setUp(c.getLabel()); } class MainCanvas extends Canvas { String ts; MainCanvas() { super(); ts=new String("first"); } public void setUp(String s) { ts=new String(s); } public void paint(Graphics g) { g.setColor(0xFFFFFF); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(0); g.drawString("Current is the "+ts,getWidth()/2,60, Graphics.HCENTER | Graphics.TOP); } } } |
程式運行後,可以根據使用者選擇的不同功能表項目顯示不同的內容。
4. 結束語
由於受到硬體環境的限制,目前所能夠寫出來的MIDlet程式功能有限,使用者介面很單調,不過隨著硬體環境的提高,這一問題會得到改善。