IDE 一鍵運行固然方便,但只懂點按鈕不知原理,遇到「驗證失敗」「JAD 中文亂碼」「真機安裝無效」就抓瞎。本文手把手走一遍 標準命令行構建流程,每步解釋「為什麼要這樣做」。
.javajavac -bootclasspath ... → .classpreverify → .class (verified).jadjar -cfm → .jarmidp -descriptor.jad/.jarHelloMIDlet.javaimport javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class HelloMIDlet extends MIDlet implements CommandListener {
private Command exitCmd; private Display display;
public HelloMIDlet() {
display = Display.getDisplay(this);
exitCmd = new Command("Exit", Command.SCREEN, 2);
}
protected void startApp() {
TextBox t = new TextBox("Hello", "Test string", 256, 0);
t.addCommand(exitCmd); t.setCommandListener(this);
display.setCurrent(t);
}
protected void pauseApp() {}
protected void destroyApp(boolean u) {}
public void commandAction(Command c, Displayable d) {
if (c == exitCmd) { destroyApp(false); notifyDestroyed(); }
}
}
midJavac.bat@echo off
rem %1 = 源文件名(不含擴展名)
javac -g:none -classpath f:\midp\classes;. -bootclasspath f:\midp\classes %1.java
關鍵:-bootclasspath 指向 WTK 的 classes.zip 解壓目錄,**強制編譯器只看到 CLDC/MIDP 庫**,防止誤用 J2SE 類 (如 java.awt, Collections) 導致真機驗證失敗。
midver.bat@echo off
rem %1 = 輸出目錄, %2 = 類名
f:\midp\bin\preverify -classpath f:\midp\classes;. -d %1 %2
原理:CLDC KVM 不做字節碼驗證,預驗證在開發機完成,生成帶 StackMap 屬性的 class 文件,設備直接信任加載,節省內存與啟動時間。
HelloMIDlet.jadMIDlet-Name: HelloWorld
MIDlet-Version: 1.0.0
MIDlet-Vendor: Sun Microsystems, Inc.
MIDlet-Description: Sample Hello World MIDlet
MIDlet-Jar-URL: https://127.0.0.1/HelloMIDlet.jar
MIDlet-Jar-Size: 1020
MicroEdition-Profile: MIDP-1.0
MicroEdition-Configuration: CLDC-1.0
MIDlet-1: HelloWorld,, HelloMIDlet
注意:MIDlet-Jar-Size 必須與 JAR 實際字節數一致;中文屬性值需用 native2ascii 轉 Unicode 轉義 (如 \u4e2d\u6587),否則真機安裝報錯。
midjar.bat@echo off
rem %1=jar文件名 %2=jad文件名 %3=類所在目錄
jar -cfm %1 %2 -C .\%3 .
midjartest.bat@echo off
rem %1=jar %2=jad
f:\midp\bin\midp -classpath f:\midp\classes;%1 -descriptor %2
若報 ALERT: Error verifying class HelloMIDlet → **未預驗證或預驗證失敗**,檢查步驟 3。
.jar、.jad 通過藍牙/紅外/數據線/OTA 下載至手機。MIDlet-Version 必須遞增才能覆蓋安裝)。| 現象 | 根因 | 對策 |
|---|---|---|
| 編譯通過,真機「無效應用」 | 用了 J2SE 類 / 未預驗證 | 嚴格用 -bootclasspath + preverify |
| JAD 中文屬性亂碼 | 未做 native2ascii 轉義 | 構建腳本集成 native2ascii -encoding UTF-8 |
| 二次安裝失敗 | JAD 版本號未遞增 | 構建腳本自動遞增 MIDlet-Version |
| 模擬器運行無需 JAR | WTK 直接加載預驗證後的 class 目錄 | 開發期可跳過步驟 4-5,直接跑 class |
七步流程看似繁瑣,實則是 J2ME 「編譯時驗證、運行時輕量」設計哲學的直接體現。熟練掌握命令行構建,才能在 CI/CD、多版本打包、異常排查時游刃有餘。