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

使用J2mePolish的build功能

編輯:J2ME

  本文主要探討如何使用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

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