摘要:對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程序功能有限,用戶界面很單調,不過隨著硬件環境的提高,這一問題會得到改善。 |
原文轉自:http://www.anti-gravitydesign.com