最近在學習J2ME,但沒多久就發現很多頭痛的問題,比如不同設備的不同硬件特性,jar和jad的自動打包,Debug的困難等等。但後來我發現這個明為J2ME Plish的項目,發現他簡直就是所有J2ME編程折夢寐以求的東西,所以介紹給大家。
J2ME Polish是德國人的一個開源項目,主頁是:http://www.J2MEpolish.org/,類似於一個Java開發環境的插件。第一篇先介紹一下它的設備優化功能(Device Optimization)。 比如這種經常遇到的情況,你的MIDLet需要發出些聲音,你知道支持MMAPI或MIDP2.0設備可以用如下方法: InputStream is = getClass().getResourceAsStream("/mymid.mid"); Player player = Manager.createPlayer(is, "audio/midi"); player.realize(); player.start(); 但目前MDIP1.0的手機還很多,很多手機有自己的API,比如在Nokia UI中,可以這樣: Sound A=new Sound(400,1000); A.setGain(100); A.play(1); 如果你要是你的程序在這兩種手機上都能用,怎麼辦呢,難道維護兩套源代碼?這會非常麻煩的。所以,我就想如果Java裡有類似C++的編譯預處理就好了,可以這樣來: #if 設備支持MMAPI 或 MIDP2.0 //do something here #elif 設備支持Nokia UI //do something diference here #endif 然後編譯器能自動產生針對不同設備的class文件就好了。這樣解決方案可為完美,而J2ME Polish就可以幫你做到這一點,J2ME Polish在某種程度上,使Java有了預處理功能,代碼如下: //#if polish.midp2 || polish.api.mmapi try{ InputStream is = getClass().getResourceAsStream("/mymid.mid"); Player player = Manager.createPlayer(is, "audio/midi"); player.realize(); player.start(); }catch(MediaException me){ //#debug error System.out.println("Unable to play midi" + me ); }catch(IOException IE){ //#debug error System.out.println("Unable to load midi" + IE ); } //#elif polish.api.nokia-ui Sound A=new Sound(400,1000); A.setGain(100); A.play(1); //#endif 我想上面的代碼我不用解釋你也能看懂吧?//#if之類就是J2ME Polish會識別的預處理標誌,除了」//」,它與C++中的語法完全相同(//debug 時J2ME Polish提供的debug功能,也很強大,以後解釋)。polish.midp之類的就是預定義的一些符號和變量, J2ME polish定義了相當豐富的符號和變量,你可以根據設備的不同平台,API,聲音,圖像處理能力,來編寫不同的代碼。 那目標文件是如何生成的呢? J2ME Polish使用ANT作為編譯管理工具,在build.XML中,有這麼一節: <requirement name="Identifier" value="Nokia/SerIEs40,Generic/midp2" /> 怎麼樣,語法很直接吧,意思就是你希望你的程序產生對應於兩種平台的結果,就是Nokia S40和一般的支持midp2的手機。J2ME Polish自帶一個數據庫,device.XML,含有各類手機類型的特性信息,所以,編譯時,前一種類型的硬件會自動使用Nokia UI的代碼,後一種則會選擇midp2的代碼。怎麼樣,是不是很好用?還有很多很好的功能,下次繼續。