J2ME 專案在打包部署前,必須經過 策略性設計 → 效能導向編碼 → 正確編譯選項 → 預驗證 → 打包部署** 完整流程。任何環節疏失都會導致真機無法安裝、執行時崩潰或效能不可接受。本文依據官方開發白皮書與實戰經驗,整理六大鐵律。
int, byte, short) 替代包裝類別 (Integer, Byte)。ref = null,釋放引用。new 物件。finally 區塊關閉串流/連線/RecordStore。早期 J2ME (MIDP 1.0/CLDC 1.0) 功能極限,若專案需大量浮點運算、複雜多媒體、本地資料庫、原生 UI,**C/C++ (Symbian C++, BREW, Windows Mobile) 或平台原生 SDK** 可能更適合。評估矩陣:
| 維度 | J2ME | 原生 C/C++ |
|---|---|---|
| 跨平台性 | 高 (一碼多裝置) | 低 (各平台重寫) |
| 效能上限 | 受限 VM、解譯執行 | 原生機器碼、可用 GPU/DSP |
| API 豐富度 | 標準 + 可選包 (JSR) | 完整 OS API |
| 開發週期 | 較短 (Java 生產力高) | 較長 (記憶體管理、指標) |
| 部署門檻 | OTA 簡單、無需簽名 (早期) | 需簽名、認證、應用商店審核 |
s += "x" 每次產生新 StringBuilder + 新 String,改用 StringBuffer (J2ME 無 StringBuilder) 或 char[] 陣列手動組裝。new Thread(),避免凍結 UI 執行緒導致裝置看門狗重啟。synchronized 會導致執行緒切換與記憶體屏障,改用 volatile、ThreadLocal、無鎖演算法 (CAS 模式) 或單執行緒設計。new 提到循環外,或使用物件池。x * 2 → x << 1、x / 2 → x >> 1、x % 16 → x & 0xF,在無 JIT 的 KVM 上差異顯著。javac -source 1.3 -target 1.1 \
-bootclasspath %WTK_HOME%\lib\cldcapi11.jar;%WTK_HOME%\lib\midpapi20.jar \
-d build\classes src\*.java
NoClassDefFoundError 或 NoSuchMethodError (呼叫 J2ME 不存在的方法)。為縮減 VM 體積,CLDC 移除類別載入時的完整位元碼驗證,改為 預驗證**:
preverify.exe 或 bin/preverify):靜態分析位元碼、插入 StackMap 屬性、檢查型別安全。MIDlet-Name, MIDlet-Version, MIDlet-Vendor, MIDlet-1 等屬性)。MIDlet-Jar-URL, MIDlet-Jar-Size, MicroEdition-Profile, MicroEdition-Configuration)。text/vnd.sun.j2me.app-descriptor / application/java-archive MIME)、資料線、紅外、藍牙。工具鏈自動化:WTK GUI / Ant wtkbuild / Maven maven-j2me-plugin / EclipseME / NetBeans Mobility 均內建預驗證步驟,**絕不可手動跳過**。
| Profile | 打包格式 | 安裝檔副檔名 | 描述檔副檔名 |
|---|---|---|---|
| MIDP | JAR (ZIP + MANIFEST) | .jar | .jad |
| PDAP | JAR + PRC 包裝 | .prc | .jad |
| DoJa (i-mode) | JAR + JAM 描述檔 | .jar | .jam |
StringBuffer/char[]finally 區塊 100% 關閉資源-bootclasspath 指向正確 J2ME API jarMIDlet-Jar-Size 與實際位元組數一致J2ME 開發沒有捷徑,只有「受限環境下的工程嚴謹度」。遵循這六大鐵律,你的 MIDlet 就能在 64 KB Jar、210 KB Heap、16 MHz CPU 的極限硬體上,穩定、流暢、安全地跑完使用者期待的每一個業務流程。這份嚴謹度,也是你邁向嵌入式 Java、Android 系統層、WebAssembly 邊緣運算的核心資產。