同一款遊戲需適配 Nokia S40/S60、Motorola、Siemens、Sony Ericsson 等數十個平台,各有專有 API(全螢幕、震動、背光、音效)。傳統做法:Class.forName 運行時檢測 + 註釋切換,導致 JAR 膨脹、效能損耗、原始碼混亂。NetBeans Mobility Pack 提供專案配置 + 預處理器區塊編譯時解決方案,實現「一碼庫、多 JAR、零運行時判斷」。
MarvTheMiner_120_all.zip(GPL 開源遊戲)src 目錄(將 res 移入 src 保持相對路徑)MarvTheMiner右鍵專案 → Properties → Manage Configurations → Add:
NokiaSeries60NokiaOtherMotorolaVodafoneDefaultConfiguration 保留作為通用基線)Tools → Java Platform Manager → Add Platform → 選擇各 SDK 安裝目錄。注意:Motorola 7.5 模擬器不符合 UEI 標準,IDE 無法自動偵測,稍後手動配置。
| 配置 | 模擬器平台 | 額外庫 |
|---|---|---|
| DefaultConfiguration | J2ME WTK 2.x (CLDC 1.0 / MIDP 2.0) | — |
| NokiaSeries60 | Nokia S60 SDK | — |
| NokiaOther | Nokia S40 SDK | — |
| Vodafone | Vodafone 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 {}
try-catch 檢測碼,保留純平台調用NokiaSeries60、NokiaOther// 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 配置。S60 支援 com.nokia.mid.ui.FullCanvas,其他平台僅有標準 Canvas。
NokiaSeries60 配置NokiaOther → 繼承 FullCanvasNokiaOther → 繼承 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