搭建標準化、可復現的 J2ME 開發環境是高效開發的前提。本文系統梳理 WTK (Wireless Toolkit) 全流程配置:JDK 選型、WTK 安裝、IDE 集成、項目結構、編譯預驗證、JAR/JAD 打包與 OTA 部署要點。
| 術語 | 全稱 | 角色 |
| CLDC | Connected Limited Device Configuration | 定義 JVM 子集與核心類庫 (java.lang/io/util 等) |
| MIDP | Mobile Information Device Profile | 提供 UI、持久化、網絡、應用生命周期 API |
| KVM | K Virtual Machine | CLDC 參考實現 JVM,針對受限設備優化 |
| WTK | Wireless Toolkit | 預驗證器、模擟器、構建腳本、文檔的綜合工具包 |
三層軟件架構
- 硬件層:手機設備
- 本地系統層:廠商 OS + 系統庫
- KVM 層:Java 運行環境
- CLDC 層:核心 API (java.*, javax.microedition.io)
- MIDP 層:GUI (lcdui)、RMS、網絡、PushRegistry 等
Windows 環境安裝步驟
- JDK 1.4.2 (必須,WTK 2.x 不支持 JDK 5+)
安裝路徑示例:D:\j2sdk1.4.2
- IDE 選擇:
- Forte for Java (Sun 官方,WTK 安裝時可選集成)
- Eclipse + MTJ 插件 / JCreator / 純文本編輯器 + Ant
- WTK 2.2:
下載 J2ME_wireless_toolkit-2_0-Windows.exe,安裝至 D:\wtk22,勾選 IDE 集成選項
MIDlet 開發基礎
核心 API 包
javax.microedition.midlet:MIDlet 抽象類、生命周期 (startApp/pauseApp/destroyApp)
javax.microedition.lcdui:高級 UI (Screen, Form, List, TextBox) + 低級 UI (Canvas, Graphics)
javax.microedition.rms:RecordStore 持久化存儲
javax.microedition.io:Generic Connection Framework (HTTP, Socket, Datagram, Comm)
HelloWorld MIDlet 模板
package com.example;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class HelloMIDlet extends MIDlet {
private Form form;
public HelloMIDlet() {
form = new Form("Hello");
form.append("Hello J2ME World!");
}
protected void startApp() {
Display.getDisplay(this).setCurrent(form);
}
protected void pauseApp() {}
protected void destroyApp(boolean unconditional) {}
}
構建流程:編譯 → 預驗證 → 打包
命令行構建腳本 (build.bat 核心邏輯)
REM 1. 編譯 (覆蓋 bootclasspath 防止誤用 J2SE 類)
javac -bootclasspath "%J2ME_API%" -classpath "%J2ME_API%" -g:none -d classes src\*.java
REM 2. 預驗證 (CLDC 字節碼驗證器簡化版)
preverify -classpath "%J2ME_API%" -d output classes
REM 3. 複製資源文件 (圖片、屬性配置等)
copy res\*.* output
REM 4. 創建 JAR (含 Manifest)
jar cvfm MyApp.jar MANIFEST.MF -C output .
REM 5. (可選) 混淆優化
java -jar proguard.jar @config.pro
REM 6. 二次預驗證 (混淆後必須)
preverify -classpath "%J2ME_API%" -d finalJar MyApp.jar
REM 7. (可選) KZip 重壓縮縮減體積
7za x MyApp.jar -ozip & kzip /r MyApp_final.jar zip\*
JAD / Manifest 關鍵屬性
| 屬性 | Manifest | JAD | 說明 |
| MIDlet-Name | 必需 | 必需 | 應用套件名稱 |
| MIDlet-Version | 必需 | 必需 | 版本號 (如 1.0.0) |
| MIDlet-Vendor | 必需 | 必需 | 開發商 |
| MIDlet-1 | 必需 | 必需 | 主 MIDlet: 名稱, 圖標, 類名 |
| MIDlet-Jar-URL | 無 | 必需 | JAR 下載地址 (OTA 關鍵) |
| MIDlet-Jar-Size | 無 | 必需 | JAR 字節大小 (OTA 校驗) |
| MicroEdition-Profile | 必需 | 必需 | 如 MIDP-2.0 |
| MicroEdition-Configuration | 必需 | 必需 | 如 CLDC-1.1 |
KToolBar 圖形化構建
- 啟動 KToolBar → New Project → 項目名/主類名
- Settings 面板:
Required/Optional/User Defined 標簽編輯屬性
MIDlets 標簽管理套件內多 MIDlet
- Build → Create Package → 生成
bin/ 目錄下 .jar/.jad
- Run → 模擟器運行調試 (支持 DefaultColorPhone, DefaultGrayPhone 等皮膚)
OTA 部署注意事項
- Web 服務器需配置 MIME:
text/vnd.sun.j2me.app-descriptor jad
application/java-archive jar
- JAD 中
MIDlet-Jar-URL 必須為絕對 HTTP URL
- 設備 AMS (Application Management Software) 會校驗 JAD 7 大必需屬性、JAR 大小、版本兼容性
- 自定義屬性勿以
MIDlet- 開頭,讀取用 MIDlet.getAppProperty()
常見坑位避雷
- JDK 版本不匹配:WTK 2.x 僅支持 JDK 1.4.x,高版本 javac 生成的類文件版本號過高導致預驗證失敗
- Bootclasspath 缺失:編譯時未指定
-bootclasspath 引入 J2SE 核心類 (如 Collections) 導致運行時 NoClassDefFoundError
- 混淆後未二次預驗證:ProGuard 修改字節碼結構,必須再次 preverify
- JAR 體積超限:部分設備限制 64KB/128KB,需啟用 KZip/7za 深度壓縮
建立標準化構建腳本 (Ant/Maven/Gradle 插件) 並納入版本控制,可消除「在我機器上能跑」的環境差異,實現持續集成與自動化發布。
- 上一篇文章: KVM 執行引擎核心:字節碼指令集實現架構與典型指令解析
- 下一篇文章: J2ME 字符串分割工具:StringTokenizer 缺失的替代實現
Copyright ©
程式碼之家 All Rights Reserved