首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

J2ME 學習筆記(三):MIDlet 從源碼到運行的 7 步標準流程

     編輯:J2ME

前言:命令行構建,看透本質

IDE 一鍵運行固然方便,但只懂點按鈕不知原理,遇到「驗證失敗」「JAD 中文亂碼」「真機安裝無效」就抓瞎。本文手把手走一遍 標準命令行構建流程,每步解釋「為什麼要這樣做」。

七步流程總覽

  1. 編寫源碼 → .java
  2. 編譯 → javac -bootclasspath ... → .class
  3. 預驗證 → preverify → .class (verified)
  4. 編寫 JAD 描述符 → .jad
  5. 打包 JAR → jar -cfm → .jar
  6. 模擬器測試 → midp -descriptor
  7. 真機部署 → OTA/藍牙/數據線安裝 .jad/.jar

逐步實戰 (以 HelloMIDlet 為例)

1. 源碼 HelloMIDlet.java

import 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(); }
    }
}

2. 編譯批處理 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) 導致真機驗證失敗。

3. 預驗證批處理 midver.bat

@echo off
rem %1 = 輸出目錄, %2 = 類名
f:\midp\bin\preverify -classpath f:\midp\classes;. -d %1 %2

原理:CLDC KVM 不做字節碼驗證,預驗證在開發機完成,生成帶 StackMap 屬性的 class 文件,設備直接信任加載,節省內存與啟動時間。

4. JAD 描述符 HelloMIDlet.jad

MIDlet-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),否則真機安裝報錯。

5. 打包 JAR 批處理 midjar.bat

@echo off
rem %1=jar文件名 %2=jad文件名 %3=類所在目錄
jar -cfm %1 %2 -C .\%3 .

6. 模擬器測試批處理 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。

7. 真機安裝

  • 將 .jar、.jad 通過藍牙/紅外/數據線/OTA 下載至手機。
  • 手機菜單選「安裝」,解析 JAD,下載 JAR,驗證簽名/大小/版本號(MIDlet-Version 必須遞增才能覆蓋安裝)。

避坑總結表

現象根因對策
編譯通過,真機「無效應用」用了 J2SE 類 / 未預驗證嚴格用 -bootclasspath + preverify
JAD 中文屬性亂碼未做 native2ascii 轉義構建腳本集成 native2ascii -encoding UTF-8
二次安裝失敗JAD 版本號未遞增構建腳本自動遞增 MIDlet-Version
模擬器運行無需 JARWTK 直接加載預驗證後的 class 目錄開發期可跳過步驟 4-5,直接跑 class

總結

七步流程看似繁瑣,實則是 J2ME 「編譯時驗證、運行時輕量」設計哲學的直接體現。熟練掌握命令行構建,才能在 CI/CD、多版本打包、異常排查時游刃有餘。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved