程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> 讓J2ME程序實現真正RunAnywhere

讓J2ME程序實現真正RunAnywhere

編輯:J2ME

"Write once,run anywhere" 是Java的口號,但在J2ME平台上做的利用,要想不修正代碼就run anywhere,難度是很大的。假如要把一個利用程序做到讓大多數的機型都實用,就要考慮到方方面面,其難度是相當大的。

比如給百寶箱做游戲,上線機型大多是MIDP1。0的機器,感到移植中最麻煩的還要數聲音部分的API,必需根據各個機型來修正。固然圖象還比擬輕易做成自適應的,但聲音部分就一般就只能根據各個機型來修正。

下面供給一種解決計劃,可以讓J2ME程序在運行時主動加載該機型支撐的聲音資源並用該

機型的聲音API來播放。

要害標題:

1。各機型供給的播放音樂的API都有所不同,特別是較老的機型。

需要在運行時根據機型主動加載。

2。各機型支撐的聲音的資源文件也不同。需要在運行時根據機型主動加載。

3。各機型的JVM不同,多多少少有一些比擬特別的BUG。

解決計劃:

1. 原則:能用尺度API就用尺度API,不能用的話,就用各個機型自身的API。

// Player types static final int STANDARD = 0; // For MIDI static final int NOKIA = 1; // For ott static final int SAMSUNG = 2; // For mmf static final int NEC = 3; // For MIDI static final String[] supportedPlayerTypes = {     "Javax.microedition.media.Player", // STANDARD API     "com.nokia.mid.sound.Sound", // 諾基亞     "com.samsung.util.AudioClip", // samsung     "com.nec.media.AudioClip", // nec };

下面利用反射機制來動態加載:

public void determinePlayerType() { // use most -> less use     isSupportSound = true;     
        

"Write once,run anywhere" 是Java的口號,但在J2ME平台上做的利用,要想不修正代碼就run anywhere,難度是很大的。假如要把一個利用程序做到讓大多數的機型都實用,就要考慮到方方面面,其難度是相當大的。

比如給百寶箱做游戲,上線機型大多是MIDP1。0的機器,感到移植中最麻煩的還要數聲音部分的API,必需根據各個機型來修正。固然圖象還比擬輕易做成自適應的,但聲音部分就一般就只能根據各個機型來修正。

下面供給一種解決計劃,可以讓J2ME程序在運行時主動加載該機型支撐的聲音資源並用該

機型的聲音API來播放。

要害標題:

1。各機型供給的播放音樂的API都有所不同,特別是較老的機型。

需要在運行時根據機型主動加載。

2。各機型支撐的聲音的資源文件也不同。需要在運行時根據機型主動加載。

3。各機型的JVM不同,多多少少有一些比擬特別的BUG。

解決計劃:

1. 原則:能用尺度API就用尺度API,不能用的話,就用各個機型自身的API。

// Player types static final int STANDARD = 0; // For MIDI static final int NOKIA = 1; // For ott static final int SAMSUNG = 2; // For mmf static final int NEC = 3; // For MIDI static final String[] supportedPlayerTypes = {     "Javax.microedition.media.Player", // STANDARD API     "com.nokia.mid.sound.Sound", // 諾基亞     "com.samsung.util.AudioClip", // samsung     "com.nec.media.AudioClip", // nec };

下面利用反射機制來動態加載:

public void determinePlayerType() { // use most -> less use     isSupportSound = true;     
        3. 對各個機型特有的BUG,是沒有什麼特別好的措施的,只能各個機型調試。這只能怪廠商了...

該計劃長處:在移植的時候就不用修正代碼。只要在相應的機型JAR包中保留相干的資源就可以了。這樣就不用為了各個機型都折騰一遍了。

留心 :用 System.getProperty("microedition.platform")來斷定機型是不保險的,由於有的機型只是簡略地返回J2ME platform。

遺留標題:

[1] NecN820 在運行 Class.forName("javax.microedition.media.Player");時候會立即報“利用程序出錯”,而不是拋出“ClassNotFoundException”異常。這是該機型JVM的特征(BUG),所以給NecN820的代碼中必需注釋掉Javax.microedition.media.Player的一切信息。這就得修正代碼,有違我們的初衷,的確是個遺憾。(估計NEC的機型都素這樣的)

[2] 這個類還有待擴大,以支撐更多機型。並加進震動部分的API。理論上可以包含所有的機型。但實際利用中只要包含需要用到的機型相干API就可以了。

測試機型: 在 三星E708,MOTOV600,NOKIA 7650 ,NecN820(注釋掉Javax.microedition.media.Player相干內容)上均測試通過。

下面是源程序
http://www.pconline.com.cn/pcedu/empolder/gj/Java/0509/acc/05-09-05-J2ME.txt

另:關於程序的編譯,可以把各個機型的API做為LIB加進eclipse工程。

歡迎指教,[email protected]

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved