本文以新手視角重新梳理 J2ME 基礎架構,涵蓋 Configuration/Profile 概念、MIDlet 生命週期、JAR/JAD 封裝、核心 API 包與開發工具鏈選擇,並附上 Hello World 完整實作步驟。
| 層級 | 名稱 | 全稱 | 說明 |
| Configuration | CLDC | Connected Limited Device Configuration | 資源受限裝置 (手機、PDA),含 KVM、核心 java.lang/io/util、javax.microedition.io |
| Configuration | CDC | Connected Device Configuration | 資源較豐富裝置,含 CVM、完整 Java 2 核心子集 |
| Profile | MIDP | Mobile Information Device Profile | 建構於 CLDC 之上,提供 UI (lcdui)、持久化 (rms)、生命週期 (midlet) 等行動裝置專用 API |
3. MIDlet 與 MIDlet Suite
- MIDlet:可執行單元,繼承
javax.microedition.midlet.MIDlet,含類別與資源檔 (非 class)。
- MIDlet Suite:多個 MIDlet 的集合 = 一個 MIDP 應用程式。通常一個 Suite 只含一個 MIDlet。部署單位為 Suite。
4. JAR 與 JAD
- JAR:ZIP 格式,包含 class、資源檔、
MANIFEST.MF (內部描述檔)。
- JAD:文字檔,外部描述檔,記錄 Suite 資訊 (名稱、版本、廠商、MIDlet 清單、JAR URL/大小、權限、憑證)。
- 編碼注意:描述檔/清單檔若含非 ASCII 字元,預設需 UTF-8 編碼 (MIDP for Palm 除外)。現代工具自動轉換中文為 UTF-8。
5. MIDP 應用程式基本存取
- 同一 JAR 內的 class 可被所有 MIDlet 共用。
- 資源檔透過
Class.getResourceAsStream("/path") 存取 (路徑以 / 開頭表 JAR 根目錄)。class 檔不可作為資源存取。
- JAD/Manifest 屬性值:
MIDlet.getAppProperty(key)。
- 平台系統屬性:
System.getProperty(key)。
6. 開發工具鏈推薦
- J2ME Wireless Toolkit (WTK) + JDK + EditPlus/UltraEdit:免費、輕量、標準合規、適合入門到精通。「重劍無鋒,大巧不工」。
- IBM VisualAge Micro Edition:介面複雜、非綠色、不推薦。
- Metrowerks CodeWarrior:IDE 完善、類 Visual Studio、適合中階、收費 (30 天試用)。
- Borland JBuilder + MobileSet:功能全但配置繁瑣。
7. 模擬器選擇
WTK 內建 6 種模擬器 (Default Color/Gray Phone, Minimum Phone, Motorola i85s, PalmOS, RIM Java Handle)。原則上針對目標裝置選擇對應模擬器,但 J2ME 跨平台特性使得結果基本一致。推薦 RIM Java Handle (螢幕大、視覺舒適),但勿忘實機螢幕尺寸差異。
8. Hello World 完整實作 (WTK 1.0.3)
- 啟動 KToolbar → New Project:Project Name:
fancy, MIDlet Class: fancy.test.HelloWorld。
- 原始碼儲存於
apps/fancy/src/fancy/test/HelloWorld.java:
package fancy.test;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class HelloWorld extends MIDlet implements CommandListener {
private Display display;
private Form form;
private Command exitCmd = new Command("Exit", Command.EXIT, 1);
public HelloWorld() {
display = Display.getDisplay(this); // 建構子取得 Display
}
public void startApp() {
form = new Form("Hello World");
form.append("Hello World!\n");
form.addCommand(exitCmd);
form.setCommandListener(this);
display.setCurrent(form);
}
public void pauseApp() {
display.setCurrent(null);
form = null;
}
public void destroyApp(boolean unconditional) {}
public void commandAction(Command c, Displayable d) {
if (c == exitCmd) {
destroyApp(false);
notifyDestroyed();
}
}
}
- 點擊 Build 編譯 → Run 執行模擬器。
9. 核心 API 包速查
javax.microedition.lcdui:UI (Command, Form, Canvas, List, Alert...)
javax.microedition.rms:記錄管理 (持久化)
javax.microedition.midlet:MIDlet 生命週期
javax.microedition.io:網路 (HttpConnection, SocketConnection...)
java.io.*, java.lang.*, java.util.*:核心精簡包
10. 中文顯示測試
模擬器通常正常顯示中文,實機可能出現亂碼 (編碼不匹配)。測試程式 Poem.java 以詩詞驗證中文渲染。
11. 系統屬性與記憶體查詢範例
System.getProperty("microedition.configuration") 等查詢平台資訊。
Runtime.getRuntime().totalMemory()/freeMemory() 監控記憶體。
12. List 選單元件用法
List list = new List("Choose URL", Choice.EXCLUSIVE); // 單選
list.append("www.pku.edu.cn", null); // 第二參數為 Image 圖示
list.addCommand(exitCmd);
list.setCommandListener(this);
display.setCurrent(list);
Choice.MULTIPLE 可實現多選清單。
- 上一篇文章: CVM 編譯實戰筆記:在 Linux 上建置 CDC Personal Profile 環境
- 下一篇文章: 三大主流 J2ME 開發平台搭建全攻略 (JBuilder/WTK/CLDC+MIDP)
Copyright ©
程式碼之家 All Rights Reserved