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

高可移植 J2ME 軟件開發指南:虛擬機差異、JSR 檢測、系統屬性與適配實戰

     編輯:J2ME

MTK 平台普及後,J2ME 虛擬機品牌爆發(JBlend、Sony Ericsson、Nokia S40/S60、Moto、三星、LG 等),「Write Once, Run Anywhere」淪為「Write Once, Debug Everywhere」。本文系統整理主流虛擬機特性、JCP/JSR 體系、系統屬性檢測代碼、應用屬性讀取、完整環境探測 Demo,構建「編譯期適配 + 運行期檢測 + 優雅降級」的高可移植開發體系。

主流虛擬機平台速覽

平台特點官方資源
JBlend日本 Aplix,廣泛用於 MTK、Moto 低端機aplixcorp.com
Sony EricssonJava Platform v8,穩定性最佳、API Bug 少、網絡無洩漏developer.sonyericsson.com
Nokia S40低端機主流,相對完善,並發連接數有限制forum.nokia.com
Nokia S60智能機,功能豐富但有特殊用法(如系統屬性鍵值不同)forum.nokia.com

JCP / JSR 體系速查

JCP (Java Community Process) 維護 Java 規範;JSR (Java Specification Request) 為具體提案。關鍵 JSR:

JSR名稱核心內容
118MIDP 2.1UI、RMS、網絡、多媒體
82Bluetooth藍牙 API
135MMAPI多媒體播放/錄製
172Web ServicesJAXP/JAX-RPC 子集
75PIM & FileConnection聯繫人/行程/文件系統
177SATSA智慧卡/加密/PKI
211CHAPI內容處理器調用
239OpenGL ES3D 圖形
179LocationLBS 定位
180SIPVoIP 信令
184M3G3D 圖形場景圖
229Payment手機支付
234AMMS進階多媒體
238I18N國際化
248MSA移動服務架構(JSR 集合基線)

運行期 JSR/特性檢測兩大法

1. System.getProperty(key)


String val = System.getProperty("microedition.profiles"); // "MIDP-2.0"
String val = System.getProperty("microedition.m3g.version"); // "1.0" 或 null

2. Class.forName(className)


boolean hasMMAPI = false;
try { Class.forName("javax.microedition.media.control.VideoControl"); hasMMAPI = true; }
catch (ClassNotFoundException e) {}

核心系統屬性鍵值表(節選)

應用屬性 (JAD/Manifest) 讀取


// JAD 中自定義屬性
Which-Locale: en

// 代碼讀取
String locale = getAppProperty("Which-Locale"); // 大小寫敏感,不存在回傳 null

完整環境探測 Demo 代碼(核心片段)


private void getSysInfo() {
    addInfo("Config", getProp("microedition.configuration"));
    addInfo("Profile", getProp("microedition.profiles"));
    addInfo("Platform", getProp("microedition.platform"));
    addInfo("JTWI", getProp("microedition.jtwi.version"));
    addInfo("M3G", getProp("microedition.m3g.version"));
    addInfo("Location", getProp("microedition.location.version"));
    addInfo("PIM", getProp("microedition.pim.version"));
    addInfo("Bluetooth", hasClass("javax.bluetooth.DiscoveryAgent") ? "yes" : "no");
    addInfo("WMA 2.0", hasClass("javax.wireless.messaging.MultipartMessage") ? "yes" : "no");
    addInfo("MMAPI", hasClass("javax.microedition.media.control.VideoControl") ? "yes" : "no");
    addInfo("FileConn", hasClass("javax.microedition.io.file.FileSystemRegistry") ? "yes" : "no");
    addInfo("CHAPI", getProp("CHAPI-Version"));
    addInfo("Nokia UI", hasClass("com.nokia.mid.ui.FullCanvas") ? "yes" : "no");
    addInfo("Siemens Ext", hasClass("com.siemens.mp.MIDlet") ? "yes" : "no");
    // ... 更多檢測
    addInfo("Total Mem", Runtime.getRuntime().totalMemory() + " bytes");
    addInfo("Free Mem", Runtime.getRuntime().freeMemory() + " bytes");
}

private String getProp(String key) {
    String v = System.getProperty(key);
    return (v == null) ? "" : v;
}

private boolean hasClass(String name) {
    try { Class.forName(name); return true; } catch (Exception e) { return false; }
}

private void addInfo(String name, String value) {
    form.append(new StringItem(name, value));
}

適配策略三層架構

  1. 編譯期適配:J2ME Polish / Ant 預處理,針對不同廠商產出差異 JAR(如 IMEI 獲取鍵值、全螢幕 API)。
  2. 運行期檢測:啟動時執行上述探測,將能力標記緩存至 DeviceCapabilities 單例。
  3. 優雅降級:核心功能接口化,提供 DefaultImpl、NokiaImpl、MotoImpl 等策略類,工廠根據檢測結果注入。缺失特性時回退至基礎實現或隱藏對應功能入口。

避坑清單

  • 系統屬性鍵值大小寫敏感,Nokia/SE/Moto 各有私有前綴。
  • Class.forName 捕獲 ClassNotFoundException 而非泛 Exception,避免掩蓋 NoClassDefFoundError。
  • JAD 自定義屬性名建議加前綴 (如 MyApp-) 避免衝突。
  • 實機測試矩陣:至少覆蓋 S40 v1/v2、S60 MIDP1/2、Moto JBlend/非 JBlend、SE JP-7/JP-8、MTK 主流晶片。
  • 簽名域 (Trusted/Manufacturer) 享有更高 API 存取權,未簽名測試結果不可作為最終依據。

結語

高可移植非一日之功,需建立「虛擬機特性資料庫 → 自動化探測 → 策略模式適配 → 持續實機回歸」的工程化流程。本文提供的屬性表、檢測代碼、適配架構可作為團隊基礎設施的起點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
屬性鍵含義典型值
microedition.platform平台標識j2me
microedition.configurationCLDC 版本CLDC-1.1
microedition.profilesMIDP 版本MIDP-2.0
microedition.locale語言環境zh_CN
microedition.pim.versionJSR 75 PIM1.0
microedition.location.versionJSR 1791.0
microedition.m3g.versionJSR 1841.0
com.nokia.mid.imeiNokia IMEI35xxxxxxxxxxxxx
com.nokia.mid.cellidNokia Cell IDxxxx
com.sonyericsson.imeiSE IMEI35xxxxxxxxxxxxx
supports.mixingMMAPI 混音true/false
audio.encodings支援音頻格式encoding=audio/wav encoding=audio/amr
fileconn.dir.photosJSR 75 圖片目錄file:///c:/My files/Images/