利用Java 編寫手機應用程式 Motorola iDEN篇
王森
臺灣交通大學科技管理研究所
[email protected]
█前言
本文內容的所有操作皆在Windows 200作業系統上經過測試。如果您在不同的平臺上驗證本文內容,例如Windows 98或是Windows Me,則我們無法保證會有相同的結果。
█簡介
不知從什么時候開始,我們突然感覺到周圍的人各各擁有一隻手機。利用手機與別人溝通成了我們生活的一部份。北歐某些先進國家的人民可以利用手機購買自動售貨機所出售的商品;他們也可以在從事行動商務(m-commence) 交易時利用手機做為一種認證工具。在日本,行動電話的許多附加功能更是年輕人文化的一部分。即將來臨的3G,無線寬頻的美夢帶給了人們對無線通訊未來的期待。
然後,有些廠商開始行銷它們自己生產的PDA,好象沒有一臺PDA在手,就不像現代人似的。各式各樣的PDA充斥市面,暢銷的與不暢銷的,讓人眼花撩亂。這時產生了一個大問題--要我們同時攜帶手機和PDA是一件很麻煩的事情-就算它們都還算輕薄短小。如果可以把手機和PDA合而為一豈不是更方便嗎? 於是聽到消費者心聲的廠商,開始有推出手機和PDA合而為一的產品,從NOKIA 9000、Motorola A6188(太極),到最近要推出的Ericsson R380、NOKIA 9210,都是手機與PDA結合的例子,雖然因為售價的關係,但是這些產品仍然是許多人夢寐以求的高階產品。
儘管有了PDA與手機結合的產品出現,我們仍然覺得有所不足,我想大家一定發現了,就是應用
相信廠商也聽到我們這些喜歡到處寫程式的工程師的心聲了,所以從2000年年底開始,即將陸陸續續有許多支援Java的手機即將推出,當然,這些廠商也提供了在手機上開發程式的SDK,我們終於可以在手機上面寫些小程式自娛了!這是以前等了很久的美夢。
手機平臺的多樣性與複雜性,和PDA比較起來可以說是有過之而無不及,於是大家就可以知道 - 哈!又是
支援Java的手機大廠目前已知有NOKIA (預計在2001年年初推出一款支援Java的手機NOKIA 9210)、Motorola(會先在支援integrated Digital enhanced network(iDEN)網路的手機上支援Java,然後再推出支援Java的GSM手機,該公司的手機大致會在2002年前全部支援Java)以及NTT DoCoMo(將在明年第二季度左右推出支援Java的手機)。
雖然這些大公司都準備支援Java,不過在決定編寫本文時,只有Motorola將其SDK開放於網站上供程式開發者下載測試,所以本文內容都是根據Motorola J2ME SDK所編寫。又由於這些手機市面上無法取得,所以我們的程式都是在SDK內附的模擬器中執行,相信最後這些手機上市時,我們所編寫的MIDlet應該會很容易併成功地在Motorola的手機上執行才對。
█如何取得Motorola J2ME SDK
我們要做的第一件事情當然還是要先取得SDK羅!
請直接到https://commerce.Motorola.com/iDENonline/ideveloper/下載Motorola J2ME SDK Drop 7。如果您不是iDEN® Developer的會員,請先在網路上註冊(免費)。註冊成功之後,Motorola會將密碼寄到您的email信箱之中,然後使用該密碼登入網頁上的My Development Center。進入之後選擇網頁上頭的TOOLS & RESOURCES以進入可下載的開發工具的網頁,請選擇Motorola J2ME SDK Components Developer Edition, Drop 7.0下方的下載超連結以下載SDK,整個SDK的大小約為3 MB左右。
請注意下載前的Download Page for Motorola J2ME™ SDK安裝說明,裡頭會告訴你安裝密碼,請先行記下。稍後當您在您的電腦上安裝Motorola J2ME SDK的時候,會詢問您安裝密碼,所以請務必記下該密碼。
█Motorola J2ME SDK的安裝
安裝需求
根據官方需求,安裝Motorola J2ME SDK的基本配備為:
Pentium 100 MHz微處理器
64 MB RAM
Windows NT WorkStation 4.0配合Service Pack 3 / Win98
(本文是在Windows 2000 Professional中文版上測試)
約6 MB的硬碟空間
Java 2 SDK 1.2.2
(本文使用Java 2 SDK 1.3.0_01作測試)
要安裝新版Motorola J2ME SDK之前,請先確認您已經將舊版的Motorola J2ME SDK完全刪除。您可以由控制檯裡頭的 「新增/刪除程式」的功能刪除舊版Motorola J2ME SDK。之後再將舊版Motorola J2ME SDK安裝所在路徑清除即可。
解開您從Motorola網站上下載的ZIP檔案,您會看到一個名為Motorola_SDK.exe的檔案,雙擊此檔案即可開始安裝動作。請注意,在安裝時系統會要求您輸入密碼,請輸入之前所紀錄的安裝密碼即可。
█Motorola J2ME SDK目錄結構
當您成功地安裝Motorola J2ME SDK之後,其目錄結構如下圖:
█MIDlet程式結構
在手機上執行的程式我們統稱MIDlet,其程式結構很簡單,與大家熟悉的Applet結構有異曲同工之妙。
每一個MIDlet程式都必須繼承自Javax.microedition.midlet.MIDlet類別,並實做三個函式,它們分別是:
protected void startApp()
protected void pauseApp()
protected void destroyApp(Boolean unconditional)
而一個MIDlet程式的起始與結束之流程我們以下圖來表示:
█編寫並編譯MIDlet
請先到您的Motorola J2ME SDK安裝目錄下的demomidlets目錄底下新建一個名為HelloMIDlet.Java的檔案,其內容為:
HelloMIDlet.Java
import Javax.microedition.lcdui.*;
import Javax.microedition.midlet.*;
public class HelloMIDlet extends MIDlet
{
HelloMIDlet()
{
}
protected void startApp() throws MIDletStateChangeException
{
}
protected void pauseApp()
{
}
protected void destroyApp(boolean unconditional)
throws MIDletStateChangeException
{
}
}
在demomidlets目錄之中您會看到一個名為compileAll.bat的批處理檔案,前面有提到,這個批處理檔案除了可以幫助您編譯所有內附範例程式之外,還可以簡化您自己所編寫的MIDlet之編譯流程。
請在命令列視窗輸入: compileAll HelloMIDlet.Java
如果成功編譯,螢幕上輸出的結果如下圖所示:
從螢幕上的輸出,您可以發現,要讓MIDlet可以在手機上執行,大體上還是要經過兩個動作(與Spotlet相似),分別是編譯(compiling)以及預先稽核(Preverifying)。
有關預先稽核這個動作,筆者已經在RUN!PC 11月號的文章「利用Java 編寫PalmOS應用程式基礎篇」之中有向讀者們提過,如果對這個方面有所疑問的朋友,請再將您的RUN!PC 11月號翻出來複習一下吧!
從這個簡短的MIDlet製作流程裡頭,相信大家可以發現,比起純粹用Sun的CLDC編寫能在KVM上執行的Spotlet要簡單上許多。原因是compileAll.bat這個批處理檔案幫我們做掉大部分dirty work。
那么,如果您寫好的程式並非放在demomidlets目錄之中,是否就無法編譯了? 從compileAll.bat裡頭,我們可以發現它幫我們完成上述兩項工作的指令。如果我們寫好的程式放在demomidlets目錄以外的地方,您可以執行下面的指令,您仍然可以成功地製作MIDlet:
(我們假設您的Motorola J2ME SDK安裝在D:MotoSDK目錄之中,並將您自行編寫的HelloMIDlet.Java置於d:jdk1.3.0_01my目錄之中。同時我們假設您在d:jdk1.3.0_01my目錄底下執行下面指令。)
編譯:
預先稽核:
1 . -classpath指向類函式庫的所在位置,也要指向我們所編寫的MIDlet所在的位置。
2 .–d指向您希望預先編譯類檔案產生之後所放置的路徑,如果寫"."表示本目錄,會覆蓋掉原先未經過預先編譯的類檔案。如果您沒有指定,則預設值為".output"目錄。
當然,如果您嫌自己手動操作很麻煩,您可以將compileAll.bat複製到其它目錄之中,並更改其編譯指令與預先稽核指令之中和類函式庫有關的相關設定即可。
提到compileAll.bat,順便向各位讀者說明一下,在前面有提到,compileAll.bat可以幫助您編譯所有位於demomidlets目錄下的範例程式,您只要在命列列下直接輸入: compileAll即可。compileAll.bat會自動當您編譯的package有以下幾項:
com.mot.j2me.midlets.bounce
com.mot.j2me.midlets.imagetests
com.mot.j2me.midlets.paddleball
com.mot.j2me.midlets.scribble
com.mot.j2me.midlets.tests
com.mot.j2me.midlets.tutorials
如果您希望compileAll.bat自動幫您編譯其它package底下的程式,請您開啟compileAll.bat,修改其COMPILECLASS環境變數的設定即可。
█修改並執行MIDlet
寫好程式之後,大家最希望的事情當然就是讓它在手機上執行,不過由於目前大家無法取得Motorola這些支援Java的手機,所以我們只能在Motorola J2ME SDK內附的模擬器上執行我們寫好的MIDlet。相信手機正式推出時,應該可以順利地在手機上執行。底下筆者將告訴您如何使用Motorola J2ME SDK內附的模擬器來測試您所編寫的MIDlet。
在這之前,由於之前我們所編寫的範例程式只是簡單的MIDlet空殼,我們必須讓它能夠在模擬器上顯示出一些資訊才可以,因此請修改上一個程式範例,使它的內容如下:
HelloMIDlet.Java
import Javax.microedition.lcdui.*;
import Javax.microedition.midlet.*;
public class HelloMIDlet extends MIDlet
{
private Display firstDisplay ;
private Form firstForm ;
HelloMIDlet()
{
firstDisplay = Display.getDisplay(this) ;
firstForm = new Form("Hello MIDlet") ;
StringItem firstStrItem = new StringItem("Hello","MIDlet") ;
firstForm.append(firstStrItem) ;
}
protected void startApp() throws MIDletStateChangeException
{
firstDisplay.setCurrent(firstForm) ;
}
protected void pauseApp()
{
}
protected void destroyApp(boolean unconditional)
throws MIDletStateChangeException
{
}
}
請將此檔案放置在demomidlets目錄下。編譯完成之後,請將目錄切換到scripts子目錄之中,您會在此目錄裡發現一些寫好的批處理檔案。請在該目錄下執行這些批處理檔案指令以啟動模擬器。執行的指令與執行結果如下所示:
<?XML:NAMESPACE PREFIX = V /><?XML:NAMESPACE PREFIX = O />指令: runEmul HelloMIDlet
輸出結果
指令: runMotoi1000 HelloMIDlet
輸出結果
指令: runMotoiDEN HelloMIDlet
輸出結果
指令: runStarTac HelloMIDlet
輸出結果
指令: runMyDevice HelloMIDlet
輸出結果
Error loading property file: C:/properties/mydevice.props (系統找不到指定的路徑。)會出現錯誤資訊是因為您沒有指定屬於是用者自訂的手機外觀的緣故,後面將會教您如何設定使用者自訂的手機外觀。
如果我們將寫好的程式放在demomidlets目錄以外的地方,您可以執行下面的指令,仍然可以成功地啟動模擬器並執行MIDlet:
(我們假設您的Motorola J2ME SDK安裝在D:MotoSDK目錄之中,並將您自行編寫的HelloMIDlet.Java置於d:jdk1.3.0_01my目錄之中。同時我們假設您在d:jdk1.3.0_01my目錄底下執行下面指令。)
執行一般模擬器
Java -DJava.library.path=d:MotoSDKlib
-classpath d:MotoSDKinEmulator.jar;d:MotoSDKinConfigTool.jar com.mot.tools.j2me.emulator.Emulator
-classpath.;d:MotoSDKlib Javax.microedition.midlet.AppManagerHelloMIDlet
-JSA 1 1
請注意:
第一個-classpath設定,-classpath與路徑名稱之間有空格。
第二個-classpath設定,-classpath與路徑名稱之間沒有空格。
執行模擬器並套用i1000手機外觀
Java -DJava.library.path=d:MotoSDKlib
-classpath d:MotoSDKinEmulator.jar;d:MotoSDKinConfigTool.jar com.mot.tools.j2me.emulator.Emulator
-classpath.;d:MotoSDKlib
-deviceFile resourcesMotorolai1000.props
Javax.microedition.midlet.AppManager
HelloMIDlet
-JSA 1 1
請注意:
第一個-classpath設定,-classpath與路徑名稱之間有空格。
第二個-classpath設定,-classpath與路徑名稱之間沒有空格。
執行模擬器並套用iDEN手機外觀
Java -DJava.library.path=d:MotoSDKlib
-classpath d:MotoSDKinEmulator.jar;d:MotoSDKinConfigTool.jar com.mot.tools.j2me.emulator.Emulator
-classpath.;d:MotoSDKlib
-deviceFile resourcesMotorolaiDENPlatform.props
Javax.microedition.midlet.AppManager
HelloMIDlet
-JSA 1 1
請注意:
第一個-classpath設定,-classpath與路徑名稱之間有空格。
第二個-classpath設定,-classpath與路徑名稱之間沒有空格。
執行模擬器並套用StarTac手機外觀
Java -DJava.library.path=d:MotoSDKlib
-classpath d:MotoSDKinEmulator.jar;d:MotoSDKinConfigTool.jar com.mot.tools.j2me.emulator.Emulator
-classpath.;d:MotoSDKlib
-deviceFile resourcesStarTac.props
Javax.microedition.midlet.AppManager
HelloMIDlet
-JSA 1 1
請注意:
第一個-classpath設定,-classpath與路徑名稱之間有空格。
第二個-classpath設定,-classpath與路徑名稱之間沒有空格。
執行模擬器並套用使用者自訂手機外觀
Java -DJava.library.path=d:MotoSDKlib
-classpath d:MotoSDKinEmulator.jar;d:MotoSDKinConfigTool.jar com.mot.tools.j2me.emulator.Emulator
-classpath.;d:MotoSDKlib
-deviceFile <您的props檔案所在的絕對路徑>Javax.microedition.midlet.AppManager
HelloMIDlet
-JSA 1 1
請注意:
第一個-classpath設定,-classpath與路徑名稱之間有空格。
第二個-classpath設定,-classpath與路徑名稱之間沒有空格。
如果您將您的props檔案放在d:MotoSDKin的resources目錄之下,則上述指令只要改成:-deviceFile resources<您的props檔名>
注意,當您您直接使用上述指令啟動模擬器,如果出現底下錯誤資訊:
Error loading property file: resources/defaultdevice.props (系統找不到指定的路徑。)
這是因為您沒有將d:MotoSDKin目錄下的resources子目錄複製到d:JDK1.3.0_01my目錄之下的緣故。
█對MIDlet進行除錯
編寫PalmOS上的Spotlet時,我們可以利用System.out.println()函式幫我們印出一些訊息以幫助除錯,那么在手機上的MIDlet呢? 原則上,我們還是可以利用System.out.println()函式做一些輸出。當模擬器執行時,就會在命令列上輸出一些訊息。
另外,在PalmOS上,有KVMutil.prc可以幫助我們紀錄程式所輸出的訊息。那手機上呢? 因為沒有實際的機器可以測試,因此這個問題到現在還不得而知,相信Motorola到時候會有完善的解決方案吧!
在Motorola J2ME SDK內附的說明檔案之中,概略地提到了除錯的問題,裡頭提到,往後如果我們要進行機上除錯(on-device debugging)的話,必須要滿足幾個條件:
- 機器本身要具備除錯相關功能,並與KDWP(Kvm Debug Wire Protocol)相容。因為除錯時,除錯工具需要利用KDWP和機器上交談以取得除錯資訊。
- 製造廠商本身要提供下載MIDlet到手機上以進行除錯的方法。
- 提供對MIDlet除錯的工具,必須支援手機在利用KDWP除錯時所使用的傳輸介面(例如序列口或UDP)。
嗯,看起來能夠進行除錯,MIDlet程式的編寫應該是很方便的事情了。
█Motorola J2ME SDK對中文的支援
相信看過RUN!PC 11月號的文章「利用Java 編寫PalmOS應用程式基礎篇」的讀者,在編寫PalmOS上的Spotlet時一定會遇到中文無法正常顯示的問題。中文的問題分成兩個部分,一個是在使用者介面上的中文問題,一個是在命令列輸出(利用System.out.println()函式所做的輸出)上的中文問題,請大家做個小實驗,將前面我們所編寫的程式改如下:
HelloMIDlet.Java
import Javax.microedition.lcdui.*;
import Javax.microedition.midlet.*;
public class HelloMIDlet extends MIDlet
{
private Display firstDisplay ;
private Form firstForm ;
HelloMIDlet()
{
firstDisplay = Display.getDisplay(this) ;
firstForm = new Form("哈羅!MIDlet") ;
StringItem firstStrItem = new StringItem("哈羅","米德列特") ;
firstForm.append(firstStrItem) ;
System.out.println("MIDlet啟動") ;
}
protected void startApp() throws MIDletStateChangeException
{
firstDisplay.setCurrent(firstForm) ;
}
protected void pauseApp()
{
}
protected void destroyApp(boolean unconditional)
throws MIDletStateChangeException
{
}
}
將本MIDlet編譯並經過預身稽核之後,我們開啟模擬器來執行此MIDlet,底下為執行結果:
我們從結果發現,預設的編譯指令會讓使用者介面正常輸出中文,而命令列無法輸出正確的中文。
接著請將compileAll.bat之中原本的指令
Javac -O -bootclasspath ....lib %COMPILECLASS%
修改為
Javac –encoding ISO8859_1 -O -bootclasspath ....lib %COMPILECLASS%
之後,重新編譯此MIDlet執行結果:
這個結果與PalmOS上所做的中文測試結果有所不同。
當您編寫Spotlet時,如果您使用Javac 。。。指令時,您會發現模擬器上的使用者介面輸出是亂碼,可是命令列上的輸出卻可以正常輸出中文。但是如果您使用的是Javac -encoding ISO8859_1 。。。指令,則CLDC內附模擬器上的使用者介面輸出或是命令列上的輸出全部都變成亂碼,無法正常輸出中文(這個部分是因為CLDC內附模擬器實做的問題,造成與實際機器的結果有差異)。
總之,如果之前您所編寫的Spotlet無法在裝有中文系統的實際機器或POSE上正常輸出中文,請您也如法炮製,在編譯指令中加入-encoding ISO8859_1,就可以在實際機器或POSE上看到正常的中文字了。
會產生此問題的主因,主要是因為編譯好的Java類檔案(byte code)之中,所有的文字編碼都採用UTF8。舉例來說,當您在程式碼裡用到"啟動"這兩個中文字時,
"起"這個字的Big5編碼為B1D2。
"動"這個字的Big5編碼為B0CA。
我們會使用Javac xxxx.Java來編譯原始碼以產生類檔案。其實這行指令,在繁體中文的Windows環境底下,相當於Javac -encoding "Big5" xxxx.Java。也就是說,當編譯器讀取到Big5編碼範圍的中文字時,會自動將此Big5碼經過「Big5è Unicode 對照表」將Big5轉為Unicode,也就是說,經過查表之後,
“起”這個字的Unicode編碼為555F。
“動”這個字的Unicode編碼為5272。
然後再利用UTF8編碼將此Unicode轉為UTF8,儲存在類檔案之中,因此,如果您用UltraEdit之類的文字編輯器檢視類檔案時,您會看到,
"起"這個字的UTF8編碼為E5959F。
"動"這個字的UTF8編碼為E58B95。
接著,當我們在程式執行時如果要將中文輸出,則JVM會負責讀進UTF8碼,然後將其轉回Unicode,最後依據您所使用的系統環境預設的編碼轉回Big5,再輸出至螢幕上。
可是經過測試結果,KVM似乎只有做到把UTF8讀進來,轉換回Unicode之後就直接輸出了。少了轉回Big5的步驟,因此,作業系統把Unicode當作Big5來處理,自然就找不到該碼所對應的中文字了,也因此輸出的是一堆 ????? 的符號。這也是我們在PalmOS上即使裝了中文系統,也無法正常顯示中文的緣故。
OK,既然知道KVM只幫我們做了一半的工作,那事情就好辦了,我們只要讓UTF8轉回之後,仍然保有Big5的編碼方式即可,於是我們使用指令Javac -encoding ISO8859_1 xxxx.Java,請編譯器不要將程式碼中中文Big5編碼的兩個byte視為一體(因為視為一體就會引發查詢Big5 è Unicode對照表的工作),只要將中文當作是普通的西歐字母字集即可,因此,當我們使用了上述指令,您會發現類檔案之中的中文變成,
"起"這個字的UTF8編碼為C2B1 C392。
"動"這個字的UTF8編碼為C2B0 C38A。
大家可以發現編譯器把B1、D2、B0、CA個別當作一個碼來處理。於是,當KVM讀到此編碼時,就會將他們轉回B1D2以及B0CA,然後KVM直接輸出,就可以正常地使用中文了。
最後總結整個問題,就筆者的推斷,CLDC內附的模擬器再沒有使用Javac –encoding ISO8859_1 xxxx.Java指令之前,會在使用者介面使命令列輸出亂碼,這才是正常的結果, 而Motorola J2ME SDK內附模擬器的使用者介面中文之所以沒問題,很可能只是因為模擬器操作的差異。因此根據KVM的輸出結果來看,很可能在實際的手機上,我們都必須加上-encoding ISO8859_1選項才能正確輸出中文吧!
在此特別感謝靜宜大學資管系的唐愷隆([email protected])同學。因為筆者於他經過熱烈的討論之後,我們才能對J2ME的中文問題有更深入的認識
█支援Motorola J2ME SDK的開發工具
在編寫本文的時候,支援MIDlet開發的整合開發環境(IDE)只有Motorola J2ME SDK附帶檔案之中所提到的CodeWarrior而已。相信其它廠商,如Borland,應該也會很快地利用其產品JBuilder的OpenTools API來支援MIDlet的開發才對,更何況Borland JBuilder目前已經有Spotlet的解決方案了。
因為筆者無法拿到CodeWarrior作測試,所以無法在此提供大家相關資訊,相信如果有機會的話,會另外以專文向大家介紹如何利用CodeWarrior編寫MIDlet。
Motorola J2ME SDK附帶檔案在附錄的部分有對利用CodeWarrior開發MIDlet做簡單的介紹,相信對初學者來說,已經相當足夠了。
█Motorola J2ME SDK內含的輔助開發工具
在Motorola J2ME SDK之中內含三項輔助開發工具,可以便利我們的程式開發工作,它們分別是:
- J2ME模擬器(J2ME Emulator)
讓您可以在您的PC上模擬Motorola將來會支援J2ME的手機裝置。如此一來就可以在PC上直接測試寫好的程式。 - Bytecode驗證器(Bytecode Verifier)
此驗證器用來驗證類檔案(classfile)之中的bytecode不會對儲存器做非法的存取。並確認載入虛擬機器器的類檔案所做的所有動作皆符合Java虛擬機器器規格(Java Virtual Machine Specification)。 - 配置編輯器(Configuration Editor)
讓您能夠建立或修改device profile。
在Motorola J2ME SDK內附的檔案之中對這三個工具有詳細的說明,筆者在此就不再贅述了。
█總結
呼!好累人,終於到了該做總結的時候了! 大家以為MIDlet就這樣結束了嗎?不! MIDlet還有許多好玩的玩意兒呢! 我們將在本系列之後的文章中為大家更深入探討MIDlet。咱們下次見。
█附錄:範例程式
Motorola J2ME SDK之中內附許多有趣的範例,它們位於demo/midlets/目錄底下。有興趣繼續精進的讀者可以由這些範例學到更多有關MIDlet的深入技巧,由於這些範例的執行畫面過大,所以在本文之中就將他們省略,請讀者們自行參考說明檔案。
這些範例程式有:
Bounce
com.mot.j2me.midlets.bounce.Bounce
PaddleBall
com.mot.j2me.midlets.paddleball.PaddleBall
Scribble
com.mot.j2me.midlets.scribble.Scribble
FontDemo
com.mot.j2me.midlets.tutorials.FontDemo
GraphicsDemo
com.mot.j2me.midlets.tutorials.GraphicsDemo
RecordStoreDemo
com.mot.j2me.midlets.tutorials.RecordStoreDemo
UDP Tutorial Application
com.mot.j2me.midlets.tutorials.UDPReceive
AlertTest
com.mot.j2me.midlets.tests.AlertTest
ChoiceGroupTest
com.mot.j2me.midlets.tests.ChoiceGroupTest
DateFieldTest
com.mot.j2me.midlets.tests.DateFieldTest
FormTest
com.mot.j2me.midlets.tests.FormTest
GaugeTest
com.mot.j2me.midlets.tests.GaugeTest
KeyEventsTest
com.mot.j2me.midlets.tests.KeyEventsTest
TextBoxTest
com.mot.j2me.midlets.tests.TextBoxTest
TextFieldTest
com.mot.j2me.midlets.tests.TextFieldTest
TickerTest
com.mot.j2me.midlets.tests.TickerTest
█網路資源
◎網站
名稱 URL
Motorola官方網站 http://www.Motorola.com/Java/
Metrowerks(CodeWarrior) http://www.Metrowerks.com