

摘要:BREW技術是在移動數據增值應用開發領域中出現的一種新技術,開發主要是應用的C語言,但手機開發中的大量問題都與C++中實現的多態效果十分相似,如果可以利用C語言這種非面向對象的語言寫出面向對象的程序,將有利于提高程序的重用性、模塊化功能以及健壯性。本論文主要圍繞著BREW平臺應用開發中一個常見應用:頁面遷移技術為例,給出了多態機制在BREW平臺下的解決方案,該方案均是在BREW手機實際開發中總結出來,具有很大的可重用性。
關鍵詞:BREW;多態機制;頁面遷移
1引言
如今,手機已不僅是語音通信的工具,而且逐步成為數據業務開發與應用的平臺,隨著科學技術的不斷更新和發展,如今手機已不僅僅是滿足打電話的功能,而是更多地成為人們在工作、學習和生活中的助手。在這種情況下CDMA手機產生了一種新的應用平臺,也就是由美國高通公司研發出的BREW平臺。BREW技術的出現使手機猶如普通電腦一樣能夠運行更多的第三方軟件,為用戶提供更多的服務。
BREW的技術優勢在于基于c語言進行的,平臺開發對于許多程序員來講均十分熟悉,移動設備制造商無需再開發專有的軟件平臺,可降低移動設備技術門檻及產品上市門檻,滿足終端用戶對最新數據應用的需求。本文主要圍繞著在BREW平臺下,如何利用C語言這種非面向對象的語言寫出面向對象的程序展開論述,并以手機應用開發中一個常見的應用—頁面遷移技術為例,對其解決方案進行了詳細的介紹和對比,該方案均是在BREW手機實際開發中總結出來,具有很大的可重用性。
2 BREW平臺簡介及應用軟件發展現狀
2.1 BREW平臺簡介
BREW的全稱是Binary Runtime Environment for Wireless,即無線二進制運行環境。從基本的層面而言,BREW平臺就是手持設備上嵌入式芯片操作系統的接口或抽象層。即是PC環境下Microsoft Windows的Win32 API。BREW平臺是一組用于本地執行、編譯并鏈接的二進制庫,優化后能使應用程序利用無線服務和資源。它控制流出或流入應用程序的事件流,能根據相應的事件啟動、停止、中止或恢復應用程序,其執行環境在運行時可以發現應用程序和任何相關的擴展。
據聯通博路通信技術有限公司2009年3月9日《BREW業務整體介紹》,到2008年底,國內支持BREW的手機機型已經超過251種,200多家中國BREW開發商提供了2479多種基于BREW的應用。
2.2 手機應用軟件發展現狀
據市場研究公司Strategy Analytics預測,盡管由于經濟危機的影響,2009年全球手機銷量雖會有所下降,但仍可達到10.8億部,銷售額會穩定在1900億歐元,甚至會有微弱增長。可以預見,隨著未來全球經濟的復蘇,全球手機市場的前景仍很樂觀。而且隨著嵌入式技術的快速發展及國內3G網絡的建立,因此未來基于BREW的手機應用軟件需求巨大。
2 BREW平臺中的多態
隨著手機業務的不斷發展,手機的軟件系統也成為一個非常龐大、復雜的軟件系統,這樣一個復雜的體系結構,應該保證能夠及時響應用戶和一些緊急事件。此時,要想使BREW平臺開發的手機游戲具有更大的優勢,選擇一種好的實現機制至關重要。
BREW平臺支持C和C++開發語言,但是一般的BREW應用程序都是用C寫的,而對于C++的使用,BREW平臺則需要做更多的事情,比如定義符重載等。而C語言是不支持面向對象的,只有C++支持面向對象的程序設計,因此BREW中必須使用C語言模擬實現C++語言面向對象機制。而面向對象技術中的關鍵技術多態是基于以上的內存模型和函數指針實現的,一般來說,如果使用類C語言描述多態,它相當于增加了一個間接層,在這個間接層攔截對于方法的調用,然后根據具體的指針指向實際對象調用相應的方法實現。
以下就以BREW中的頁面遷移的方案為例進行詳細的論述。
3 BREW平臺中的頁面遷移
對于一個手機的應用軟件,要隨時注意手機的按鍵變化,在每一個狀態下的每一次乃至每一個手機按鍵的變化,都將會出現不同的界面和效果。這就是所說的BREW平臺下的頁面遷移,在該過程中手機畫面不停變換,而手機的鍵盤只有一個,這時,應用程序如何判斷該具體執行何種操作,就成為BREW平臺上應用程序開發中一個重要的問題。
使用手機的經驗告訴我們,手機頁面需要頻繁的進行遷移時,實現頁面遷移的方案和其效率的高低對于內存很小的手機來說都是至關重要的。
3.1 基本BREW頁面遷移方案
對于一個BREW開發的頁面遷移的程序,基本的解決反感就是可以自行設置一組宏分別代表頁面的不同狀態,每個狀態再對應一個BREW的事件處理過程,在每個事件處理中,通過對按鍵的判斷來調用不同的應用函數,如頁面的新建、打開、重畫、刪除、和鍵盤事件的相應函數,調用后再進行頁面的遷移。BREW可以利用這種調用的機制,實現通過按鍵完成函數和函數之間不斷的調用過程。
該類方案的具體處理過程在手機處理按鍵的caseEVT_KEY中:根據不同的頁面的宏標識ID執行不同頁面的handleevent事件函數。
例如:
//根據不同的窗口,調用不同文件中的事件處理程序
switch(pMe->activeView) {//判斷當前的活動頁面
case IDW_GAME://如果是游戲頁面,則執行游戲頁面對應的事件處理程序
return GameWnd_HandleEvent(pMe->game, eCode, wParam, dwParam);
case IDW_MAINMENU: //如果是主頁面,則執行主頁面對應的事件處理程序
return MainMenuWnd_HandleEvent(pMe->mainMenu, eCode, wParam, dwParam);
……
default:break ;
}
該種方案的特點是較為利于理解,但是使用時容易出錯,不宜調試。
3.2 類多態的BREW頁面遷移方案
經過上述分析可以看出,手機中的頁面遷移問題與C++中實現的多態效果十分相似,也就是完成一個窗體接口類的實現, 該接口類能完成繪制屏幕和接收客戶鍵盤輸入的功能,對于客戶的相同輸入, 不同的窗體結構應該能體現出不同的行為。如果可以利用C語言這種非面向對象的語言寫出面向對象的程序,將有利于提高程序的重用性、模塊化功能以及健壯性。
BREW平臺中的宏QINTERFACE,GET_PVTBL,DECLARE_VTBL可以用來完成這種效果。其本質就是在基類的層次上定義一個“空函數集”,通過該空函數集實現一個抽象的,虛擬的,通用的接口層,可以在運行時根據對象的實際類型動態地調用派生類的那些“具體”函數,簡言之,就是同一個接口函數,根據具體的對象,調用具體的函數。
使用時首先通過Qinterface定義了一個包含VTBL(虛函數表)的接口,在運行時,根據具體傳入的對象類型調用了具體派生接口的“具體”函數。如:#define IWINDOW_Enable(p)GET_PVTBL(p, IWindow)->Enable(p, TRUE)這里p是IWINDOW指針類型。用戶調用IWINDOW_Enable(p)時,雖然此時傳入的是IWINDOW類型指針,但是其實質是派生的具體接口類型,所以最終調用到的就是屬于它(派生具體接口)的具體接口函數了。
以下代碼用于完成一個滿足上述要求的頁面遷移過程。
typedef struct _IWindowIWindow;
QINTERFACE(IWindow)
{
void (*Enable)(IWindow * po, boolean bEnable);
void (*Redraw)(IWindow * po);
boolean(*HandleEvent)(IWindow * po, AEEEvent eCode, uint16 wParam, uint32 dwParam);
……
};
#define IWINDOW_Enable(p) GET_PVTBL(p, IWindow)->Enable(p, TRUE)
…
#define IWINDOW_Redraw(p) GET_PVTBL(p, IWindow)->Redraw(p)
#define IWINDOW_HandleEvent(p, e, w, dw) GET_PVTBL(p, IWindow)->HandleEvent(p, e, w, dw)
……
#define INHERIT_CWindow(iname)
DECLARE_VTBL(iname)
IShell * m_pIShell;
IDisplay * m_pIDisplay;
struct CWindow
{
INHERIT_CWindow(IWindow);
};
具體實現的功能如圖1所示:
上述代碼實現了一個結構體CWindow,其中包含三個成員,一個是指向函數表結構體類型的指針vtIWindow,另兩個是普通成員指針。要通過指針vtIWindow訪問函數的話,則只需要創建對應接口的函數表的實例,把接口實例的對應的函數表保存起來,然后用修改過的函數表結構體替換到接口之中,當調用對應的接口函數的時候, 就具有了特殊定義的行為。
通過上述工作,已經得到了一個窗體的基接口類,在其基礎上可以派生自己的接口類來構造不同的窗體。并在派生接口類窗體中增加自己的數據成員,也可以增加接口行為,這樣,就可以構造出負責各種功能的窗體來滿足移動應用的需要。如圖2所示。
4 結束語
文中針對手機開發的具體問題提出相應的解決方案,該方案均是在BREW手機實際開發中總結出來的。這些方法和框架代碼具有很大的可重用性,很好的解決了在BREW手機開發中頻繁出現的頁面遷移問題,有一定現實意義。
參考文獻
[1]唐際宇,楊永田,王驥.BREW平臺內部接口機制的探討[J].航空電子技術, 2006(3).