解析 KJava 在移動(dòng)設(shè)備開(kāi)發(fā)支持中的應(yīng)用
2024-07-21 02:39:04
供稿:網(wǎng)友
摩托羅拉A6288、388型手機(jī)的登場(chǎng),伴隨著一個(gè)亮點(diǎn):自身帶有Kjava虛擬機(jī)(KVM),能夠通過(guò)多種方式下載且能夠運(yùn)行用戶(hù)用KJava編寫(xiě)的符合MIDP1.0規(guī)范的應(yīng)用程序。后來(lái),又有多款手機(jī)支持KJava。 實(shí)際上,KJava不僅能夠?yàn)锳6288等手機(jī)編寫(xiě)應(yīng)用程序,而且還可以為其它一些移動(dòng)信息設(shè)備編寫(xiě)應(yīng)用程序。這類(lèi)嵌入式程序和一般的Java程序相比,有它的非凡之處,本文將對(duì)KJava及其應(yīng)用進(jìn)行介紹。
1.KJava簡(jiǎn)介
Java語(yǔ)言最初是為嵌入式系統(tǒng)設(shè)計(jì)的一項(xiàng)產(chǎn)品,在Java 2中為了區(qū)分各種不同的應(yīng)用,又細(xì)分成了Java 2 EnterPRise Edition(J2EE)、Java 2 Standard Edition(J2SE)和Java 2 Micro Edition(J2ME)三種版本,其中J2ME又稱(chēng)作KJava。
在J2SE中,它定義了Java規(guī)范的核心類(lèi)函數(shù)庫(kù)(即Java.*)和擴(kuò)展類(lèi)函數(shù)庫(kù)(即Javax.*),它主要定位在客戶(hù)端的應(yīng)用程序。J2EE主要定位于服務(wù)器端的應(yīng)用程序,它除了支持J2SE所定義的核心類(lèi)函數(shù)庫(kù)之外,還增加了一些擴(kuò)展函數(shù)類(lèi)庫(kù),如支持Serverlet/jsp的Javax.servlet.*等。J2ME只支持J2SE所定義的核心函數(shù)類(lèi)庫(kù)的一部分,此外,在J2ME中還增加了一些支持嵌入式系統(tǒng)的擴(kuò)展類(lèi)函數(shù)庫(kù),如Javax.microedition.*等。
同樣是嵌入式設(shè)備,它們?cè)谶\(yùn)算能力、電力供給等方面還是有很大的差別。Connected Limited Device Configuration(CLDC)規(guī)范描述的就是那些運(yùn)算能力有限、電力供給有限的嵌入式設(shè)備,如手機(jī)等;而Connected Device Configuration(CDC)規(guī)范則描述的是像電視機(jī)頂盒這樣運(yùn)算能力較強(qiáng)、電力供給充足的系統(tǒng)。J2ME分別支持這兩種不同的配置。在同一種配置下,J2ME又通過(guò)Profile來(lái)定義與特定嵌入式設(shè)備相關(guān)的擴(kuò)展類(lèi)函數(shù)庫(kù)。
在傳統(tǒng)的Java環(huán)境中,為了防止程序在傳送途中被篡改以及其它一些安全上的考慮,當(dāng)程序被類(lèi)別載入器載入后,緊接著要進(jìn)行Byte Code審核,審核通過(guò)以后才答應(yīng)Java虛擬機(jī)執(zhí)行它。這一操作在PC機(jī)上執(zhí)行從速度上來(lái)看沒(méi)有什么問(wèn)題,但是在CLDC所描述的這類(lèi)系統(tǒng)中,要想作完全相同的處理,從處理能力和速度上來(lái)看就顯得有些力不從心了。為了解決這個(gè)問(wèn)題,程序設(shè)計(jì)人員需要在程序設(shè)計(jì)結(jié)束之后額外再多做一件事:預(yù)先審核。通過(guò)預(yù)先審核,會(huì)在最終的類(lèi)文件中加入一些非凡的符號(hào),當(dāng)該程序下載到目標(biāo)平臺(tái)上去執(zhí)行時(shí),可以以較快的速度完成審核操作。
2. Motorola SDK
下面以摩托羅拉A6288型手機(jī)為例來(lái)具體講解KJava的程序設(shè)計(jì)。在摩托羅拉A6288中使用了兩顆CPU,一顆是Dragon Ball VZ 33MHz,用于個(gè)人數(shù)字處理,另外一顆用于通訊的處理。系統(tǒng)為用戶(hù)預(yù)留了約1M的內(nèi)存空間,支持符合MIDP 1.0規(guī)范的KJava應(yīng)用程序。我們可以到摩托羅拉的官方網(wǎng)站去下載開(kāi)發(fā)工具:CodeWarrior(試用版),下面的內(nèi)容就是基于這一開(kāi)發(fā)工具。
在CodeWarrior中,它包含了摩托羅拉的SDK,它實(shí)現(xiàn)了CLDC和MIDP 1.0。它所實(shí)現(xiàn)的CLDC類(lèi)庫(kù)有Java.io.*、Java.lang.*、Java.util.*和Javax.microedition.io.*,實(shí)現(xiàn)的MIDP類(lèi)庫(kù)有Javax.microedition.lcdui.*、Javax.microedition.rms和Javax.micromedition.midlet。
我們?cè)赑C環(huán)境下編寫(xiě)的嵌入在瀏覽器中的Java程序叫做Applet,編寫(xiě)的程序必須要從Applet類(lèi)擴(kuò)展自己的類(lèi)。而為手機(jī)這類(lèi)移動(dòng)信息設(shè)備編寫(xiě)的KJava程序叫做MIDlet,程序必須要從MIDlet類(lèi)擴(kuò)展自己的類(lèi)。一個(gè)MIDlet程序具備如下的典型結(jié)構(gòu):
public class HelloWord extends MIDlet
{
HelloWord()
{……}
public void startApp()
{……}
public void pauseApp()
{……}
public void destroyApp(boolean unconditional)
{……}
}
當(dāng)程序被啟動(dòng)時(shí),startApp()被系統(tǒng)調(diào)用。(當(dāng)程序剛開(kāi)始運(yùn)行時(shí)有啟動(dòng)過(guò)程,程序被暫停后也可以被再次啟動(dòng))。當(dāng)程序被暫時(shí)停止運(yùn)行時(shí),pauseApp()被調(diào)用。當(dāng)程序執(zhí)行結(jié)束時(shí)destroyApp()被調(diào)用。我們可以根據(jù)實(shí)際情況在各函數(shù)中進(jìn)行相應(yīng)的處理。
在摩托羅拉SDK中沒(méi)有AWT或者SWING,因?yàn)樗鼈兊膶?shí)現(xiàn)會(huì)耗費(fèi)太多的資源,摩托羅拉SDK只是在Javax.microedition.lcdui中實(shí)現(xiàn)了基于LCD的一些比較簡(jiǎn)單的設(shè)計(jì)用戶(hù)界面的功能。SDK中定義了各種Displable類(lèi)(如Form),程序中當(dāng)前顯示的畫(huà)面必須是某個(gè)Displable的實(shí)例,在該實(shí)例中可以再放置按鈕、文本編輯框、單選框等UI。
3. 舉例
下面是用KJava編寫(xiě)的一個(gè)可以在A6288型手機(jī)上運(yùn)行的簡(jiǎn)單的例子。具體程序如下:
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);
}
}
}
程序運(yùn)行后,可以根據(jù)用戶(hù)選擇的不同菜單項(xiàng)顯示不同的內(nèi)容。