本文主要探討如何使用j2mepolish進行build,至於j2mepolish的其他強大功能,本文不涉及。本人接觸J2MEpolish時間不長,若有漏洞或出錯,請路過的朋友指正,同時歡迎大家拍磚。
對於J2mepolish的主要功能,不用再多講,其大名在j2me已經如雷貫耳。若還有朋友了解或希望加深“感情”,請訪問www.J2MEpolish.org。
雖然目前很多公司或個人已經熟練使用其開發J2me軟件,但遺憾的是,國內對J2mepolish的交流太少。其中j2medev 的favoyang翻譯了“j2mepolish用戶手冊”部分章節,感興趣的朋友,可以到J2MEdev論壇進行下載:
http://www.J2MEdev.com/bbs/dispbbs.ASP?boardID=32&ID=3800&page=2
J2MEpolish安裝
安裝過程其實很簡單,在此主要探討關於eclipse的插件“mepose”。在Javaeye上,有文章探討J2MEpolish的安裝過程,其中,mepose是在另外獨立安裝的插件,而在2.0-RC4版本中,自帶了mepose插件,只要在安裝過程中填入eclipse.home和選擇Eclipse Integration(Mepose),就可以安裝mepose插件。
在Eclipse中使用J2MEpolish
如果在Eclipse的file->new->project出現j2mepolish工程,則說明mepose插件已經成功安裝,至此,就可以新建j2mepolish工程。新建的J2MEpolish工程中,包含了自動創建的build.xml文件,以及src、resource等默認目錄。運行只需右鍵選中build.XML,點擊run as->ant build。
當然,不使用mepose插件也可以,因為Eclipse默認支持ant。所以,只需要按照sample中的目錄結構存放資源和源碼,並是用語法正確的build.XML文件就可正常使用j2mepolish,畢竟,J2MEpolish的build功能,只是ant的擴展。
Eclipse的plugins目錄中,自帶有ant,eclipse3.2中的ant版本為1.6.5。如果希望使用自己的ant,可以在Eclipse中的Windows->preference->ant中設置Ant Home,將路徑指向自己的ant目錄,這樣可以保持與Eclipse外的ant版本一致。
build.XML
sample中的build.xml,個人覺得寫得太過於繁瑣,中間夾雜太多注釋。這對於不初學者,特別是不熟悉ant腳本的朋友,會比較“郁悶”。由於本文重點探討ant的build功能,所以,只討論build.XML中的“J2MEpolish”target,其他部分,請參考相關文檔。
主要用於描述midlet相關信息,幫助設置JAD和MANIFEST。但部分中,可以通過子元素設置jad其他屬性。有關相關屬性的定義,請參考favoyang翻譯《創建》或《Pro J2ME Polish Open Source Wireless Java Tools Suite》
雖然是可選,但卻與device數據庫緊密相關。如果需要使用device相關數據,特別是對多版本的J2ME程序打包,這部分的設置尤為重要。
實際的build操作部分,在此設置midlet類名,以及第三方庫包的導入等。在屬性中,usePolishGui用於標示是否適用polish的GUI功能,注意該屬性缺省是true。所以,如果沒有用到polish的該功能,最好將其設置為false,否則打包時,將會加入polish自帶一些類庫,因此,會增加jar包的大小。
部分也是j2mepolish創建的重要部分,但並非本文討論重要,具體內容請參考favoyang翻譯《創建》或《Pro J2ME Polish Open Source Wireless Java Tools Suite》。
Device數據庫
J2mepolish存儲了超過 230種 J2ME 設備和相應的J2ME 參數,如 Canvas的大小, APIs, 支持格式等。其中,所有的數據都定義在device.xml文件中(安裝過程,需選中External Device Database)。當然,可以隨時更新device.XML數據庫。
事實上,device數據庫對於j2me開發非常重要。在本人的開發經歷中,很多次都無奈難於獲得某類機型的具體信息,如:堆棧大小,是否支持特定的擴展包等。即使有的公司擁有這樣一套數據集合,也多半是以Excel的形式保存,卻無法與程序結合起來使用。這點,也為j2me程序的機型適配工作帶來了繁重的工作量。J2mepolish在這方面對j2me開發做出重大貢獻,以至於想antenna這樣的開源項目已經支持J2MEpolish提供的device數據庫。
在開發過程中,結合J2MEpolish的預處理機制,我們可以很便捷的使用該數據庫。
廢話了大半天,先來看看具體device是如何定義的,以nokia/6600為例:
XML 代碼
<device>
<identifier>Nokia/6600<!--</span-->identifIEr>
<groups>SerIEs60<!--</span-->groups>
<features>hasCamera<!--</span-->features>
<capabilityname="OS"value="SymBianOS7.0s"/>
<capabilityname="ScreenSize"value="176x208"/>
<capabilityname="BitsPerPixel"value="16"/>
<capabilityname="JavaPackage"value="mmapi,wmapi,btapi,jtwi"/>
<capabilityname="JavaPlatform"value="MIDP/2.0"/>
<capabilityname="VideoFormat"value="3gpp,mpeg-4,realvideo"/>
<capabilityname="SoundFormat"value="midi,midi24,truetones,amr,wb-amr"/>
<capabilityname="HeapSize"value="3mb"/>
<capabilityname="MaxJarSize"value="dynamic"/>
<capabilityname="CameraResolution"value="640x480"/>
<capabilityname="CameraZoom"value="2"/>
<capabilityname="Font.small"value="15"/>
<capabilityname="Font.medium"value="16"/>
<capabilityname="Font.large"value="21"/>
<capabilityname="Bugs"value="BluetoothRfcommInputStream"/>
<capabilityname="wap.userAgent"value="Nokia6600/*"/>
<!--</span-->device>
用於標示該設備,由廠商和設備名組成。
用於標示該設備屬於哪個Group,設備本身的記號(symbol)繼承於group的。例如,6600屬於SerIEs60組,所以6600就擁有nokia-ui記號。J2MEpolish在預處理//#if nokia-ui時,就處理為true。而Group本身也存在著繼承關系,例如,SerIEs60又繼承於Nokia-UI組。
用於標示該設備具有的功能,如,攝像頭、觸摸屏等。
用於設備各項重要屬性,如堆棧大小,屏幕大小等。在本例中,沒有左右軟鍵值定義,是因為其已經被定義在SerIEs60組中。
使用device數據庫和預處理
本節重點討論如何使用指定設備的相關數據。首先,在build.XML中指定設備,在此我們以Nokia/6600和Motorola/E680為例,定義如下:
XML 代碼
<deviceRequirements>
<requirementname="IdentifIEr"value="Nokia/6600,Motorola/E680"/>
</deviceRequirements>
下面按照以下幾點目標來設計代碼:
1、6600版本使用FullCanvas,E680版本使用SetFullScreenMode
2、6600版本使用Nokia的翻轉方法,E680版本使用Midp2.0的
3、獲取設備自身的堆棧大小,屏幕大小等信息
源代碼片段如下:
Java 代碼
源代碼片段如下:
publicclassMyCanvas
//#ifpolish.api.nokia-ui
//#extendscom.nokia.mid.ui.FullCanvas
//#else
extendsCanvas
//#endif
{
publicMyCanvas()
{
//#ifndefpolish.api.nokia-ui
//#setFullScreenMode(true);
//#endif
//#ifdefpolish.ScreenSize:defined
//#=Stringscreensize="${polish.ScreenSize}";
//#else
Stringscreensize="128*128";
//#endif
//#ifdefpolish.HeapSize:defined
//#=intheapSize=${bytes(polish.HeapSize)};
//#else
intheapSize=1000;
//#endif
}
protectedvoidpaint(Graphicsg)
{
}
publicvoiddrawClip(Graphicsg,intx,inty,Imageimage,intclipX,
intclipY,intclipWidth,intclipHeight,intmode)
{
//#ifpolish.api.nokia-ui
//#...
//#nokia的切片繪制方法,具體代碼省略
//#...
//#else
...
midp2.0的切片繪制方法,具體代碼省略
...
//#endif
}
}
運行build.XML之後,可以在build/real目錄下,找到預處理以後的6600版和E680版代碼。J2MEpolish的預處理結果就體現在此,預處理後代碼請感興趣的朋友動手實踐,在此就不貼出來了。
思考
本人對於J2mepolish的了解還需深入,但在使用之後,對J2MEpolish有以下幾點思考,歡迎大家交流。
<!--[if !supportLists]-->j2mepolish在build功能上面,其實就是ant擴展。當然,其本身也是支持其他ant擴展,如,打包完成後,自動將jar文件上傳到服務器上。但是功能強大的同時,卻帶來的是自由度的下降。例如,在存在以下需求時,用j2mepolish來實現打包,可能就比較繁瑣了:在一份源碼的基礎上,對不同的資源目錄進行打包。如,A版本使用的資源目錄為res1,B版本使用的資源目錄為res2;不同版本,jad屬性不同。本人認為,J2MEpolish中,選擇不同的設備是在處指定,這樣一來,不同版本之間區別就很難在一個build.XML文件中或者一次build過程中定義清楚。當然,並非說J2MEpolish不能實現以上需求,這就是仁者見仁,智者見智了。
<!--[if !supportLists]-->J2MEpolish編譯使用的庫,如: midp2.0.jar、cldc1.0.jar等,都是來自於polish_home/import目錄下,這樣不方便相關庫的升級和使用。
相關項目介紹
Antenna:應用於j2me的ant擴展,最新版本支持預處理,也支持J2MEpolish的device數據庫。地址:http://antenna.sourceforge.Net/
J2ME Device DB:類似於Antenna的一個項目,擁有自己的設備數據庫,也支持預處理。地址:http://J2ME-device-db.sourceforge.Net/pmwiki/index.PHP?n=Main.HomePage
軟件版本
J2MEpolish-2.0-RC4
jdk1.5
eclipse3.2