"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]