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

J2ME MIDP 設備碎片化解決方案:NetBeans + Marv The Miner 實戰(上)

     編輯:J2ME

背景:設備碎片化是 J2ME 開發最大噩夢

同一款遊戲需適配 Nokia S40/S60、Motorola、Siemens、Sony Ericsson 等數十個平台,各有專有 API(全螢幕、震動、背光、音效)。傳統做法:Class.forName 運行時檢測 + 註釋切換,導致 JAR 膨脹、效能損耗、原始碼混亂。NetBeans Mobility Pack 提供專案配置 + 預處理器區塊編譯時解決方案,實現「一碼庫、多 JAR、零運行時判斷」。

環境準備

  • NetBeans IDE + Mobility Pack 4.0+
  • J2SE SDK 1.4.2+
  • J2ME WTK 2.0+
  • 目標平台 SDK:Nokia S60、S40、S80、S90、Motorola SDK 4.1、Vodafone SDK
  • 源碼:MarvTheMiner_120_all.zip(GPL 開源遊戲)

專案導入與配置建立

  1. File → New Project → Mobile → Mobile Project from Existing MIDP Sources
  2. 選擇解壓後的 src 目錄(將 res 移入 src 保持相對路徑)
  3. 專案名:MarvTheMiner

建立 5 個專案配置

右鍵專案 → Properties → Manage Configurations → Add:

  • NokiaSeries60
  • NokiaOther
  • Motorola
  • Vodafone
  • (預設 DefaultConfiguration 保留作為通用基線)

模擬器平台註冊

Tools → Java Platform Manager → Add Platform → 選擇各 SDK 安裝目錄。注意:Motorola 7.5 模擬器不符合 UEI 標準,IDE 無法自動偵測,稍後手動配置。

配置專案屬性:平台與庫

配置模擬器平台額外庫
DefaultConfigurationJ2ME WTK 2.x (CLDC 1.0 / MIDP 2.0)—
NokiaSeries60Nokia S60 SDK—
NokiaOtherNokia S40 SDK—
VodafoneVodafone SDK—
Motorola(無 UEI 模擬器)Motorola SDK 4.1/Emulator7.5/lib/*.zip

操作:取消勾選「Use Values from DefaultConfiguration」→ 獨立設定。

預處理器區塊:編譯時隔離平台差異

原始碼痛點:initStaticData() 運行時檢測

vendor = 0;
try { Class.forName("com.nokia.mid.sound.Sound"); vendor = 1;
  try { Class.forName("com.nokia.mid.ui.DeviceControl"); ... vendor = 2; } catch {} }
catch {}
try { Class.forName("com.vodafone..."); ... vendor = 3; } catch {}
try { Class.forName("com.motorola..."); ... vendor = 4; } catch {}

重構步驟

  1. 刪除所有 try-catch 檢測碼,保留純平台調用
  2. 選中 Nokia 專用行 → 右鍵 → Preprocessor Blocks → Manage → 勾選 NokiaSeries60、NokiaOther
  3. 選中 Vodafone 專用行 → Preprocessor Blocks → Vodafone
  4. 選中 Motorola 專用行 → Preprocessor Blocks → Motorola

重構後效果

// Nokia 區塊(僅 NokiaSeries60、NokiaOther 編譯進入)
//#mdebug NokiaSeries60 NokiaOther
com.nokia.mid.ui.DeviceControl.setLights(0, 100);
//#enddebug

// Vodafone 區塊
//#mdebug Vodafone
com.vodafone.v10.system.device.DeviceControl.getDefaultDeviceControl()
    .setDeviceActive(DeviceControl.BACK_LIGHT, true);
//#enddebug

// Motorola 區塊
//#mdebug Motorola
com.motorola.multimedia.Lighting.backlightOn();
//#enddebug

切換 Active Configuration 即可看到區塊高亮/灰化,編譯時自動包含/排除。

處理 beep() 與 run() 中的平台差異

  • beep():Nokia 兩種音效 API、震動 API;Vodafone 震動;Motorola 震動 → 各自建立預處理區塊,Nokia 震動同時關聯兩個 Nokia 配置。
  • run():Vodafone 專用背光保持調用 → 獨立區塊關聯 Vodafone 配置。

解決 Nokia FullCanvas 繼承差異

S60 支援 com.nokia.mid.ui.FullCanvas,其他平台僅有標準 Canvas。

  1. 啟用 NokiaSeries60 配置
  2. 右鍵類宣告 → Create If/Else Block (NokiaSeries60)
  3. 第一個區塊(If)加入 NokiaOther → 繼承 FullCanvas
  4. 第二個區塊(Else)加入 NokiaOther → 繼承 Canvas
//#mdebug NokiaSeries60 NokiaOther
public class GameCanvas extends com.nokia.mid.ui.FullCanvas implements GameObject {
//#enddebug
//#mdebug
public class GameCanvas extends javax.microedition.lcdui.Canvas implements GameObject {
//#enddebug

階段性成果

  • 5 個配置對應 5 種目標平台
  • 平台專有 API 完全編譯時隔離,JAR 無冗餘類、無運行時檢測
  • 共用邏輯碼 100% 復用,僅平台適配層差異化
  • 下一步:建置驗證、非 UEI 模擬器整合、資源分級打包
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved