1.1 QNX 實時操作系統(tǒng)介紹
QNX 實時操作系統(tǒng)(QNX Real Time Operating System)是由位于加拿大渥太華的QNX軟件系統(tǒng)公司開發(fā)的一個針對嵌入式應用的微內核操作系統(tǒng),。QNX軟件系統(tǒng)公司成立于1981年,,在過去的20多年中一直致力于微內核實時操作系統(tǒng)的研究與開發(fā),。目前的QNX 實時操作系統(tǒng)已經發(fā)展成一個可以使用在嚴實時應用中的高可靠性實時操作系統(tǒng),,能夠運行在x86/Pentium, PowerPC, ARM, StrongARM, XScale, MIPS, SH-4等一系列硬件平臺上,,是在關鍵任務應用中首選的兩個實時操作系統(tǒng)之一(另外一個是VxWorks),。 QNX 是一個與電氣工程師協(xié)會(Institute of Electrical and Electronics Engineers,,IEEE)發(fā)表的便攜式操作系統(tǒng)界面標準(Portable Operating System Interface, POSIX) 相兼容的實時操作系統(tǒng),。該操作系統(tǒng)提供了一系列可裁剪的功能全面的高可靠性高性能組件,,包括分布式計算,,資源管理,網絡應用,,圖形窗口系統(tǒng),,文件系統(tǒng),以及對Java的支持等等,。此外,,QNX還是一個與Linux高度兼容的操作系統(tǒng),由于gcc和gmake等Linux 平臺上常用的應用程序開發(fā)工具已經被移植到QNX 平臺上,,很多為Linux平臺編寫的應用程序可以直接拿到QNX平臺上編譯運行,。此外,QNX還提供了一個類似于Visual C++的應用程序集成開發(fā)環(huán)境,,稱為Photon Applicatioin Buider (PHAB),。在這個集成開發(fā)環(huán)境里程序開發(fā)人員能夠很方便的開發(fā)和調試基于圖形用戶界面的QNX 應用程序。 更為重要的是,對于應用程序開發(fā)人員來說,,QNX是一個完全免費的實時操作系統(tǒng),。根據(jù)QNX軟件系統(tǒng)公司發(fā)布的使用授權協(xié)議,在一個產品商業(yè)化之前應用程序開發(fā)人員可以自由的使用QNX實時操作系統(tǒng)系統(tǒng)而無須向QNX 公司交付任何軟件使用費用,。同樣,,QNX的應用程序集成開發(fā)環(huán)境PHAB對于軟件開發(fā)人員來說也是免費的。QNX 實時操作系統(tǒng)以及QNX應用程序集成開發(fā)環(huán)境均可以從QNX公司的主頁www.下載,。
1.2 QNX 實時操作系統(tǒng)對Java語言的支持 QNX Neutrino使用IBM公司開發(fā)的業(yè)界領先的J9虛擬機為Java應用程序以及小應用程序提供了支持,。目前可供選擇的方案有兩個,一個是與J2ME標準完全兼容的WebSphere嵌入式環(huán)境,,另外一個是WebSphere客戶環(huán)境,,提供了一個可裁剪的Java 2語言標準的子集。由于QNX 是一個多任務操作系統(tǒng),,因此可以同時運行多個虛擬機為不同的應用程序提供服務,。基于微內核的microGUI窗口界面系統(tǒng)為AWT提供了全面的支持,,在其它平臺上開發(fā)的基于AWT的圖形用戶界面可以不加修改的在QNX平臺上運行,。此外,QNX還通過使用本地線程保證了正確的線程調度,。 IBM公司開發(fā)的J9虛擬機通過了Modena JT++以及Plum Hall JVS 等一系列嚴格的業(yè)界測試,,是一個與J2ME標準完全兼容Java虛擬機。由于J9是一個專門為實時的嵌入是應用開發(fā)的虛擬機,,因此在其設計中對速度優(yōu)化,,內存管理,線程管理,,本地方法,,垃圾回收,及時編譯,,可移植性以及可裁剪性能方面做了很大的努力,。根據(jù)多個公開發(fā)表的測試結果,J9虛擬機是目前運行速度最快的嵌入式Java虛擬機,。對本地方法的支持,,使得應用程序開發(fā)人員能夠直接控制外圍設備,調用實時操作系統(tǒng)的功能,。J9虛擬機本身對內存的要求極少,,用戶更可以通過一個配置工具使得應用程序在特定的嵌入式系統(tǒng)中對內存的要求降低到最小。就象一般的Java應用程序一樣,,內存的分配和回收都是通過虛擬機來自動管理的,,因此在一般情況下不會產生內存泄露,。此外,J9虛擬機還提供了一個垃圾回收機制管理工具,,使得用戶能夠在運行時刻控制和改變所使用的垃圾回收機制,。在線程管理方面,J9虛擬機直接使用底層實時操作系統(tǒng)所提供的線程調度機制,,從而保證了正確的代碼能夠在正確的時間被執(zhí)行,。高度可裁剪的類庫使得用戶能夠將應用程序所不需要的類和方法排除在嵌入式系統(tǒng)之外,從而進一步節(jié)省了對系統(tǒng)存儲空間的要求,,也間接地提高了嵌入式應用程序的執(zhí)行速度,。目前版本的J9虛擬機支持大多數(shù)流行的嵌入式軟硬件平臺,包括運行在x86, MIPS, PowerPC, SH-4, 68K, SPARC平臺上的Windows, Linux, QNX, Solaris, AIX, Pocket PC, Palm OS等操作系統(tǒng),。由于J9虛擬機卓越不群的表現(xiàn),,它被Java Pro雜志評選為2002年度最佳嵌入式Java平臺。同時,,使用J9作為Java平臺的WebSphere Studio Device Developer (也就是以前的Visual Age for Java Micro Edition) 也被Java Pro雜志評選為2002年度最佳嵌入式開發(fā)工具,,又被Java World雜志評選為最佳Java設備應用程序開發(fā)工具。 值得一提的是,,QNX 軟件系統(tǒng)公司是Eclipse Consortium的發(fā)起者和最早的成員之一,。Eclipse 是由IBM 公司牽頭開發(fā)的開放源代碼的Java應用程序開發(fā)平臺,其目的是為應用程序開發(fā)人員提供一套完備的高度可裁剪的高性能軟件開發(fā)組件,。Eclipse Consortium成立于2001年11月,目前已經擁有Borland, IBM, QNX, Red Hat, SuSE, Sybase, Rational等18個成員,。由Eclipse Consortium 發(fā)布的Java應用程序集成開發(fā)環(huán)境Eclipse是完全免費的,,可以運行在Windows, Red Hat Linux, SuSE Linux, Solaris, QNX和AIX等操作系統(tǒng)上。也就是說,,在QNX平臺上也是可以使用集成開發(fā)環(huán)境Eclipse來開發(fā)Java應用程序的,。
1.3 QNX 實時操作系統(tǒng)以及集成開發(fā)環(huán)境的安裝和配置 QNX實時操作系統(tǒng)的安裝非常簡單。首先你需要從QNX公司的網站下載最新版本的QNX 操作系統(tǒng),,下載的地址是http://www./nc/download.qnx,。目前最新的版本是QNX 6.2,下載文件是qnxnc620.iso,,這是一個CD-ROM映像文件,。將這個映象文件里面的內容刻錄到一張光盤上,然后利用該光盤啟動計算機即可開始安裝QNX 操作系統(tǒng),??偟膩碚f安裝的過程相當?shù)暮唵危恍枰x擇啟動方式以及指定QNX 文件系統(tǒng)所在的位置即可,。系統(tǒng)文件拷貝完成后將自動的重新啟動機器,,然后需要用root登錄進入系統(tǒng)并且自動安裝其它應用程序,。在一臺500 MHz + 128 MB的計算機上,安裝過程通常都小于15分鐘,,相對來說還是非??斓摹O到y(tǒng)安裝完成后,,即可直接使用PHAB以及gcc等程序開發(fā)工具,, 但是要使用Java還需要進行一點小小的配置。 J9虛擬機的缺省安裝位置是/usr/eclipse/ive,。在這個目錄下有bin和lib兩個子目錄,,bin目錄包含了J9虛擬機的可執(zhí)行文件和所需要的庫文件,lib目錄則包含了各種版本的Java類庫,。未來在QNX 系統(tǒng)上使用J9虛擬機,,我們需要將合適的目錄包括在PATH和LD_LIBRARY_PATH 這兩個環(huán)境變量中。我們需要修改用戶家目錄(~)下面的.profile文件,,使之包含如下語句: export J9_HOME=/usr/eclipse/ive 應用程序集成開發(fā)環(huán)境Eclipse SDK for QNX可以從Eclipse Consortium的主頁下載,,下載地址是http://www./downloads/。將所下載的zip 文件拷貝到/usr目錄中,,然后使用unzip命令解壓縮,。然后你還需要下載針對 J9虛擬機的插件,下載地址是http://dev./viewcvs/index.cgi/ %7Echeckout%7E/jdt-debug-home/plugins/org.eclipse.jdt.launching.j9/ index.html,。你需要根據(jù)你所下載的Eclipse SDK for QNX的版本好選擇一個合適的插件,,然后將下載的zip文件解壓縮到/usr/eclipse/plugins目錄中。同樣,,我們需要修改用戶家目錄(~)下面的.profile文件從而將Eclipse 所需要的路徑和庫路徑包含在環(huán)境變量PATH和LD_LIBRARY_PATH中,。 export ECLIPSE_HOME=/usr/eclipse 到此為止我們以及成功的安裝與配置了QNX 實時操作系統(tǒng)以及相關的Java應用程序開發(fā)工具。下面我們簡單的介紹幾個常用的命令: j9c -- 類似于Java SDK中的javac命令,,是用來編譯Java源代碼的,。
1.4 一個簡單的Hello World程序 在沒有開始寫Hello World之前,我們首先介紹一下QNX 上的文本編輯器,。很多熟悉類UNIX操作系統(tǒng)的朋友也許會對vi比較熟悉,,但是從Windows操作系統(tǒng)過來的朋友也許不太喜歡。我們這里使用的是QNX 操作系統(tǒng)自帶的圖形化編輯軟件ped,。 利用下面命令啟動ped: #ped & 下面是HelloWorld.java的源代碼:
使用j9c命令編譯Java源代碼: #j9c HelloWorld.java 使用j9命令運行Java應用程序: #j9 HelloWorld 需要注意的是,,QNX 操作系統(tǒng)和Java語言都是大小寫敏感的,所以一定要把大小寫都寫對了,。另外,,對源代碼進行編譯的時候需要加上文件擴展名,,在運行一個Java應用程序的時候則不需要加上文件擴展名。如果排除了這幾種錯誤之后你仍然無法正確的編譯或者是運行你的Hello World程序,,請參考 1.3正確配置你的PATH和LD_LIBRARY_PATH,。 2.1 J9C 編譯器的使用
j9c是J9虛擬機自帶的字節(jié)碼編譯器,相當于標準版Java開發(fā)工具中的javac命令,。這個編譯器的用法如下: #j9c <編譯選項> <源代碼文件 | 目錄名> 在j9c編譯器中主要的編譯選項如下: -help
2.2 J9虛擬機的使用 和標準版Java開發(fā)工具相類似,,可以使用j9命令啟動J9虛擬機,。這個命令的用法如下: #j9 <運行選項> 主類名稱 [運行參數(shù)] J9虛擬機中主要的運行選項如下: -jxe
2.3 J9虛擬機上的標準類庫 嵌入式應用程序和普通應用程序的最大的區(qū)別在于嵌入式應用程序處處要受到目標平臺的處理速度,內存大小以及存儲空間的限制,,而基于PC 的應用程序所受的限制則相對要小很多,。基于以上考慮,,所選擇的虛擬機必須在能夠滿足系統(tǒng)要求的情況下盡可能的少占用系統(tǒng)存儲空間,,經過編譯的字節(jié)碼文件必須盡可能的以提高執(zhí)行效率。因此,,在嵌入是應用程序的開發(fā)中,,虛擬機的裁剪是提高系統(tǒng)整體性能的至關重要的一個環(huán)節(jié)。 基于如上需求,,J9虛擬機專門為不同的應用提供了不同的標準類庫,。這些標準類庫均提供了運行Java應用程序所必須的基本類,例如Java語言中最基本的java.lang.Object和java.lang.String等等,。一個完全版的 J9虛擬機通常包括如下標準類庫: jclXtr jclCldc jclCore jclGateway jclMax jclPersonal 不包括在QNX 缺省安裝中的J9標準類庫可以從IBM 公司開發(fā)的Webshpere Studio Device Developer 中獲得,。Webshpere Studio Device Developer是基于Eclipse項目的針對嵌入式 Java應用的一個集成開發(fā)環(huán)境,可以從IBM 公司的主頁免費下載,,下載地址是 http://www.ibm.com/software/ad/embedded,。
2.4 一個從串口設備采集數(shù)據(jù)的簡單程序 數(shù)據(jù)采集與處理是當前嵌入式應用的一個熱點。在這種應用中,,嵌入式系統(tǒng)與各種各樣各樣的傳感器或者是數(shù)據(jù)采集器等外接設備進行通訊,,在其內部對各種數(shù)據(jù)進行處理并向外接設備輸出反饋信號。到目前為止,,串口通訊(主要是RS-232和RS-485)仍然是傳感器與主機進行通訊的主流方式,,因此在一個嵌入式應用程序中,經常需要通過串口與串口設備進行通訊,。 在標準版的Java語言中,,串口通訊是通過擴展類庫javax.comm來實現(xiàn)的。由于這個擴展類庫在標準的JDK 中并不提供,,需要使用到串口通訊功能的軟件開發(fā)人員必須到IBM或者是Sun公司的網站去下載,,在一定程度上影響了這個擴展類庫的普及和使用,。J9虛擬機在設計上充分考慮到了嵌入式應用的需求,在各個版本的標準類庫中都提供了對串口通訊的支持,。這些功能被放在serial.jar這個包里面,,可以在如下目錄下找到: $J9_HOME/lib/jclCdc/serial.jar 在QNX 系統(tǒng)上,J9虛擬機缺省的類路徑(CLASSPATH)是jclMax標準類庫,,也就是$J9_HOME/lib/jclMax/classes.zip,。也就是說,如果在程序中需要用到串口通訊的時候,,我們需要將serial.jar添加到虛擬機的類路徑里面去,。在QNX系統(tǒng)上設置類路徑的方法于Linux系統(tǒng)比較相似,只需要修改 .profile文件把新的CLASSPATH定義好就可以了,。 # export CLASSPATH=$J9_HOME/lib/jclCdc/serial.jar J9虛擬機缺省的類路徑,,也就是$J9_HOME/lib/jclMax/classes.zip 不需要顯式的定義。 serial.jar里面包含了很多用于與串口設備進行通訊的類,,需要詳細了解的網友可以自行參考相關的文檔,。一般來說,于串口設備進行通訊需要經過如下步驟: (1) 創(chuàng)建一個SerialConfiguration對象,,然后根據(jù)特定設備的通訊參數(shù)修改一下波特率等值,。 在QNX 系統(tǒng)下,,設備名被保存在/dev目錄下,,串口設備被起名為ser(n),其中n是該串口設備的編號,,從1 開始計數(shù),。例如/dev/ser1相當于暈倒死系統(tǒng)上的COM1,/dev/ser2相當于暈倒死系統(tǒng)上的COM2,。因此,雖然J9 虛擬機在各個平臺上都提供了對串口進行操作的包serial.jar,,但是程序員仍然需要考慮到在不同的平臺上設備名是不一樣的,。 下面的示范程序演示了與串口進行通訊的一般過程。該程序與連接在ser1 的設備進行通訊,,將該設備的輸出信息打印到屏幕上,。
對上面這個示范程序進行編譯的時候,由于程序中使用了jclMax標準類庫之外的類,,所以需要在編譯的時候指定類路徑,,也就是: # j9c -classpath $CLASSPATH SerialDemo.java 在運行這個示范程序的時候,不需要再次顯式的指定類路徑,,因為j9命令會自己到系統(tǒng)的CLASSPATH里面去找: # j9 SerialDemo 需要說明的是,,在J9虛擬機中同樣提供了對擴展類庫javax.comm的支持。但是基于 J9虛擬機的嵌入式Java應用中,,普遍的做法是直接使用J9虛擬機本身的serial.jar,。
3.1 AWT類庫的安裝和配置
對嵌入式Java比較熟悉的朋友一定知道目前大多數(shù)的嵌入式虛擬機都提供了對AWT 的支持。例如Sun公司開發(fā)的Personal Java,,Insignia公司開發(fā)的Jeode,,Nsicom公司開發(fā)的CrEme,還有PERC公司開發(fā)的Perc,,當然還包括我們正在介紹的IBM J9,。就我個人所了解的情況,Nsicom公司開發(fā)的CrEme 是目前唯一的一個支持Swing 的嵌入式Java虛擬機,。關于為什么在嵌入式Java中普遍使用AWT而不使用Swing的問題,,我們會在這一章的第三節(jié)進行討論。 根據(jù)我們在2.3 節(jié)中的介紹,,J9虛擬機在jclPersonal 標準類庫中提供了對AWT的支持,,但是在QNX的缺省安裝中并不包括這個類庫。因此,,我們需要從J9虛擬機的新家WebSphere Studio Device Developer (也就是原先叫做Visual Age for Java Micro Edition的)中獲得這個類庫,。 首先我們必須從IBM 的網站下載WebSphere Studio Device Developer,下載的地址是www.ibm.com/software/ad/embedded/,。這是IBM公司基于 Eclipse開發(fā)的嵌入式Java集成開發(fā)環(huán)境,,如果你以前用過Visual Age for Java或者是Eclipse的其它版本的話,想來應該很容易的就能夠上手,。WSDD有兩個版本,,一個是給Windows平臺的,另外一個是給Linux平臺的,。但是在這個標準版的WSDD中既不包括QNX平臺的運行環(huán)境,,也不包括我們所需要的jclPersonal 類庫,所以我們還要下載WSDD的Software Updates,。QNX 平臺的運行環(huán)境在Runtime Software Updates中,,jclPersonal庫在Custom Environment Software Updates中,所以這兩個update我們都要下載。 首先安裝WSDD,,將下載來的Software Updates解壓到一個臨時目錄下,,然后啟動WSDD。從主菜單選取Help -> Device Developer Updates,。點擊Add或者是Update All,,在隨后跳出來的對話框里面選Local Predefined Locations。在最下面的Location一欄里面填上你所需要安裝的Update,,格式為file:/$dir,,例如: file:/c:/temp/wsddupdates/wsdd/4.0/runtimes/ 安裝結束以后在下面這個目錄找到QNX 的jclPersonal類庫prsnlqnx.jar: wsdd/wsdd4.0/ive/runtimes/qnx/common/ive/lib/jclMax/ 如果你的QNX 和Windows或者是Linux主機是兩臺獨立的計算機的話,你可以通過網絡或者是其它的可移動存儲設備將prsnlqnx.jar拷貝到你的 QNX 系統(tǒng)上,。如果你的QNX 和暈倒死或者是利怒死主機是安裝的同一臺計算機的不同硬盤或者是同一塊硬盤的不同分區(qū)上的話,,你可以啟動QNX 進入文件管理器,然后進入/fs目錄看看里面是不是能夠看見其它的硬盤或者是分區(qū),。如果沒有看到你所需要的硬盤或者是分區(qū),,你可以使用mount命令啟用相對應的硬盤或者是分區(qū),使得你可以從QNX 系統(tǒng)下對這些硬盤或者是分區(qū)上面的文件進行操作,。 將prsnlqnx.jar文件放到/usr/eclipse/ive/lib目錄下,,然后修改類路徑,最好是在~/.profile文件里面改: export CLASSPATH=$CLASSPATH:/usr/eclipse/ive/lib/prsnlqnx.jar 到目前為止,,我們已經完成了AWT類庫的安裝和配置,。 3.2 一個簡單的AWT圖形用戶界面 AWT是Java語言中構建圖形用戶界面的標準。由于Java語言卓越的跨平臺特性,,在一個平臺上編寫的基于AWT的圖形用戶界面可以不加修改的直接移植到另外一個平臺上使用,。通常來說,構建一個基于AWT的圖形用戶界面需要經過如下步驟: (1) 創(chuàng)建一個頂級容器對象,,例如Window或者是Frame,。 下面是一個簡單的基于AWT的圖形用戶界面:
使用下面的命令編譯以上例程: #j9c -classpath $CLASSPATH HelloAwt.java 使用下面的命令運行以上例程: #j9 HelloAwt 在Sun 公司撰寫的Java入門教程The Java Tutorial中有專門的一章介紹了基于AWT 的圖形用戶界面,。但是由于目前Swing已經正式成為標準版Java2 中構建圖形用戶界面的標準,這一章的內容被Sun 公司從The Java Tutorial網站上撤下,,但是各位讀者仍然可以從Sun 公司的網站下載這部分的教程: http://java./docs/books/tutorial/information/download.html#OLDui 3.3 關于AWT和Swing的一點討論 在第一節(jié)中我們提到了目前大多數(shù)的嵌入式Java虛擬機都提供了對AWT 的支持但是不提供對Swing 的支持,。但是,在標準版的Java平臺上Swing 才是推薦使用的圖形界面系統(tǒng),,在Sun 公司所提供的Java Tutorial 中甚至把基于AWT 的圖形用戶界面設計這一部份從其網站中刪除,,需要利用到AWT 進行圖形用戶界面設計的用戶只有將該部份下載到本地硬盤才能夠使用這部份教程,。在標準版Java中正值春風得意的Swing 為什么到了嵌入式應用中便不再吃香了呢? AWT 是Abstract Window ToolKit (抽象窗口工具包)的縮寫,,這個工具包提供了一套與本地圖形界面進行交互的接口。AWT 中的圖形函數(shù)與操作系統(tǒng)所提供的圖形函數(shù)之間有著一一對應的關系,,我們把它稱為peers,。 也就是說,當我們利用 AWT 來構件圖形用戶界面的時候,,我們實際上是在利用操作系統(tǒng)所提供的圖形庫,。由于不同操作系統(tǒng)的圖形庫所提供的功能是不一樣的,在一個平臺上存在的功能在另外一個平臺上則可能不存在,。為了實現(xiàn)Java語言所宣稱的"一次編譯,,到處運行"的概念,AWT 不得不通過犧牲功能來實現(xiàn)其平臺無關性,,也就是說,,AWT 所提供的圖形功能是各種通用型操作系統(tǒng)所提供的圖形功能的交集。由于AWT 是依靠本地方法來實現(xiàn)其功能的,,我們通常把AWT控件稱為重量級控件,。 Swing是在AWT的基礎上構建的一套新的圖形界面系統(tǒng),它提供了AWT 所能夠提供的所有功能,,并且用純粹的Java代碼對AWT 的功能進行了大幅度的擴充,。例如說并不是所有的操作系統(tǒng)都提供了對樹形控件的支持, Swing 利用了AWT 中所提供的基本作圖方法對樹形控件進行模擬,。由于 Swing 控件是用100%的Java代碼來實現(xiàn)的,,因此在一個平臺上設計的樹形控件可以在其他平臺上使用。由于在Swing 中沒有使用本地方法來實現(xiàn)圖形功能,,我們通常把Swing控件稱為輕量級控件,。 說到這里我想各位讀者應該明白了AWT和Swing之間的基本區(qū)別:AWT 是基于本地方法的C/C++程序,其運行速度比較快,;Swing是基于AWT 的Java程序,,其運行速度比較慢。對于一個嵌入式應用來說,,目標平臺的硬件資源往往非常有限,,而應用程序的運行速度又是項目中至關重要的因素。在這種矛盾的情況下,,簡單而高效的AWT 當然成了嵌入式Java的第一選擇,。而在普通的基于PC或者是工作站的標準Java應用中,硬件資源對應用程序所造成的限制往往不是項目中的關鍵因素,,所以在標準版的Java中則提倡使用Swing,, 也就是通過犧牲速度來實現(xiàn)應用程序的功能,。
4.1 SWT類庫的安裝和配置
Eclipse 項目的發(fā)布在IT界可以說是一次震撼,這不僅僅是因為IBM 公司無償公開了花費4000萬美元開發(fā)出來的一整套代碼,,也不僅僅是因為支持這個項目的包括目前在市場上相當吃香的Rational, Borland, Red Hat以及QNX等公司,。最讓人吃驚的是:Eclipse 項目的矛頭直接針對的是IBM公司最親密無間的Java合作夥伴 -- Sun公司。就象Eclipse這個名字所意味的那樣,,IBM 的目的是要建立一套各種程序設計語言都能夠使用的模塊化的開發(fā)平臺,,并且希望它能夠成為一個業(yè)界公認的標準平臺。 Eclipse項目中最令人震撼的一點是它用稱為SWT的的圖形庫和工具包取代了Java標準中的AWT和Swing,。根據(jù)Eclipse項目的解釋,,SWT直接調用了操作系統(tǒng)的圖形庫,從而使得Java應用程序的Look & Feel 與操作系統(tǒng)的習慣完全一致,;更為重要的是,,對本地方法的直接調用大幅度的提高了基于SWT 的Java應用程序的運行速度。關于SWT與AWT/Swing的優(yōu)點和缺點我們將在這一章的第三節(jié)中進行比較和討論,。 為了在我們的Java應用程序中使用SWT,,我們需要做一點必要的配置,如下: (1) /usr/eclipse/plugins/org.eclipse.core.runtime/runtime.jar 是Eclipse平臺的運行庫,,需要將它放到類路徑里面,。 修改.profile文件,如下: export CLASSPATH=$CLASSPATH:/usr/eclipse/plugins/org.eclipse.core.runtime/runtime.jar 改動過這些設置以后,,最簡單的辦法是重新啟動Photon來讓這些新的設置生效,。 4.2 一個簡單的SWT圖形用戶界面 通常來說,構建一個基于SWT 的圖形用戶界面需要經過如下步驟: (1) 創(chuàng)建一個Display對象,,該對象代表一個SWT 進程(session),。 下面是一個簡單的基于SWT 的Java應用程序HelloSwt:
使用下面的命令編譯以上例程: #j9c -classpath $CLASSPATH HelloSwt.java 使用下面的命令運行以上例程: #j9 HelloSwt 我們可以看到,,基于SWT的圖形用戶界面在外觀上和基于AWT的圖形用戶界面有明顯的不同,。更為重要的是,能夠明顯的感受到HelloSwt的啟動速度比HelloAwt要快很多,。 QNX 高效的微內核圖形界面系統(tǒng)當然是提高用戶應用程序運行速度的一個方面,,但是更重要的是SWT 直接調用了QNX 的微內核圖形界面系統(tǒng)的功能,而AWT 則沒有利用到操作系統(tǒng)所提供的這些優(yōu)勢,。 SWT 是一套與AWT/Swing 完全不同的圖形界面系統(tǒng),新接觸SWT 的程序員還是需要花費一段時間來熟悉SWT的結構和API,。下面推薦的幾個參考資料能夠讓你輕松的開始利用SWT 進行圖形用戶界面設計: The Programmer's Guide for Eclipse,, 這是Eclipse項目發(fā)布的官方程序員手冊,其PDF 版可以從這個地址下載: http://www./documentation/pdf/org.eclipse.platform.doc.isv.pdf 這份文檔也可以從這個網站聯(lián)機查看: http://download./downloads/documentation/2.0/html/plugins/org.eclipse.platform.doc.isv/ 另外,,www.最近在其網站上發(fā)布了關于SWT的結構及其應用的一系列文章,,也非常的有參考價值。如果有感興趣的網友,,請自行到 Eclipse 的網站查看,。 4.3 關于SWT和AWT/Swing的一點討論 通過3.3 的討論我們知道在AWT 中的圖形用戶界面是通過本地方法來實現(xiàn)的,每個AWT 方法都有一個與其對應的本地方法,,稱為peer,。由于平臺無關性的需要,AWT 所能夠實現(xiàn)的功能是各種不同操作系統(tǒng)的圖形庫所提供的功能的交集,。通過這種機制,,在所有的平臺上相同的AWT 控件的Java代碼是一樣的,其性能也是類似的,。SWT 所采取的則是一種完全相反的方法,,它是通過一些本地方法將操作系統(tǒng)的圖形庫完全的暴露給虛擬機。在這些本地方法的基礎上,,SWT 通過純粹的Java代碼實現(xiàn)了需要的圖形界面功能,。由于各個操作系統(tǒng)所提供的圖形庫是不一樣的,同樣一個控件在不同平臺上的Java實現(xiàn)通常來說是不一樣的,?;谕瑯拥牡览恚瑯拥腟WT 程序在不同平臺上的性能和表現(xiàn)也許是不一樣的,。 SWT 所采取的這種方法決定了它在技術上要比AWT 要具有更多的優(yōu)點,,如下: (1) 如果操作系統(tǒng)A 支持某種圖形控件而操作系統(tǒng)B 不支持,AWT 就會出于平臺無關性的要求拒絕提供這個控件,。SWT 則會在操作系統(tǒng)A 上原封不動的調用操作系統(tǒng)所提供的控件,,在操作系統(tǒng)B 上則使用該操作系統(tǒng)所提供的其它功能對該控件進行模擬,。例如Windows平臺本身就提供了樹和表格等控件而其它一些操作系統(tǒng)不提供這些控件,SWT 在Widnows平臺上就會直接調用Windows的方法來實現(xiàn)這些控件,,AWT 為了實現(xiàn)平臺無關性拒絕提供這些控件,,Swing 則為了實現(xiàn)純Java的目的在AWT 的基礎上自己來畫這些控件 -- 盡管它畫出來的東西很少有畫得好的。 (2) 由于SWT 大量的采用了本地平臺所提供的圖形庫,,SWT 中的控件風格跟本地平臺的UI風格是完全一致的,,因為在SWT 中的控件基本上就是操作系統(tǒng)本身的控件。這一點對于AWT 來說是比較相似的,,但是Swing 的表現(xiàn)就不太一樣了,,譬如說在Windows XP上面用Swing 畫一顆樹它看起來就跟Widnows 2000上面的樹一模一樣,盡管Windows XP跟Widnows 2000本身的樹形控件是不一樣的,。 (3) 在SWT中,,大部份的事物邏輯都是用Java寫的,在SWT 中C/C++代碼的比重遠比AWT中C/C++代碼比重要小,。這樣使得程序設計人員能夠更加方便的對SWT 應用程序進行調試,,也能夠更清楚的知道在后臺運行的本地方法究竟在做什么事情。更為重要的是,,SWT利用比AWT 更少的C/C++ 代碼實現(xiàn)了比AWT 更快的圖形用戶界面,,這個優(yōu)勢在嵌入式應用中往往是決定性的。 SWT 的缺點主要在于兩點:(1) 不是Java語言標準,;和(2) 支持的平臺太少,。目前版本的Eclipse僅僅支持Windows 98/ME/2000/XP, RH 7.1, SuSE 7.l, Solaris 8, QNX, AIX和HP-UX幾個有限的平臺。而作為Java 語言標準的AWT/Swing 則在目前大部份的主流和非主流操作系統(tǒng)上都有支持,。
|
|