隨著 Android 紅火與 Windows Mobile 跟進,中國移動 OPhone 看似他人技術。本文探討如何將 J2ME API 移植至 OPhone。
中國擁有全球最大電信客群,僅移動用戶達 4 億。3G 費用降低是大勢所趨,不久將形成巨大 3G 浪潮。中國移動推出 OPhone OS 系統,採用 Linux 2.6 核心,相容 Android 應用。OPhone 為中國移動 3G 戰略旗艦,承載海量 3G 業務應用。大量軟體企業將陣地轉向移動平台:手機電視、炒股、網遊、企業 MIS、移動辦公等將成熱點,需大量開發人員,薪資高於一般 PC 開發。依託 MMArket 亦有前景。
Android 移植除硬體外,核心在 Java 平台間移植。市面主流 Java VM 為 Sun Java ME,Google Android 採用自家 Dalvik。如何從 J2ME 移植至 Android?
雖開發環境不同,但實現功能相近,可從功能角度理解 OPhone OS 與 J2ME 聯繫與差異。若代碼框架佳,邏輯部分基本不變,僅需轉換平台相關介面。總結四方面:
最麻煩處。Android 圖形類與 Sun Java ME 差異大,且 SDK 變化快,移植常需自行實現相關類,可能影響效率。需花大量時間學習,為未來重點講解。
Android 附帶 SQLite 資料庫,功能與效能遠超 J2ME 的 RMS。過去 J2ME 開發常用自定義二進制格式或 XML 替代。
Android 採用 Sun I/O 庫(InputStream 等)與 URLConnection 類,基本無變化,移植時注意堆疊空間調整即可。
Android 官方推薦 MediaPlayer,支援 mp3、mid、wav、mp4 等常規格式,比 J2ME 靈活強大得多。
J2ME 主體類 MIDlet,調用 startApp() 進入應用。OPhone OS 對應 Activity,調用 onCreate(savedInstanceState) 進入交互界面。透過繼承 Activity 模擬實現 MIDlet:
public abstract class MIDlet extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
startApp();
}
public abstract void destroyApp(boolean unconditional);
public String getAppProperty(String key) { return null; }
public abstract void startApp();
public void notifyDestroyed() {}
public void notifyPaused() {}
public void pauseApp() {}
public void platformRequest(String URL) {}
public void resumeRequest() {}
}
J2ME Canvas 類似 OPhone OS View 類:
public abstract class Canvas extends Displayable {
public Canvas(MIDlet context) { super(context); }
Graphics g = new Graphics();
public void onDraw(android.graphics.Canvas canvas) {
g.bind(canvas); paint(g);
}
// ... 其餘方法存根實現
protected abstract void paint(Graphics g);
}
J2ME Graphics 類似 OPhone OS Paint 類。移植中用 OPhone OS 類庫實現 Graphics,可修飾 Graphics 物件,整合 Canvas 並調用 Paint、Color 方法。例如:
public class Graphics {
public final static int VCENTER = 0; TOP = 1; SOLID = 2; RIGHT = 3; LEFT = 4; HCENTER = 5; DOTTED = 6; BOTTOM = 7; BASELINE = 8;
Canvas dist;
private final Paint paint = new Paint();
public void bind(Canvas canvas) { dist = canvas; }
public void setColor(int eraseColour) {}
public void drawImage(Image img, int x, int y, int anchor) {
dist.drawBitmap(img.getTp(), x, y, paint);
}
}
以上重新定義的 Graphics 類,在方法實現上調用 OPhone OS 具體方法,用其類庫實現 J2ME 框架,達到平台間良好移植。
從例子可見兩平台框架有許多相似性,創造移植條件。但也存在差異,部分 J2ME 類無法直接繼承或調用 OPhone OS 實現,需移植人員自行實現相關類,這是移植過程中需克服的困難。