《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > BREW平臺中接口的設計與實現
BREW平臺中接口的設計與實現
來源:微型機與應用2012年第5期
張 茜,張繼榮
(西安郵電學院,陜西 西安 710061)
摘要: 為了說明BREW中如何實現用C語言來模擬C++中的面向對象的特性,實現接口的聲明與實現的分離、對多個接口的支持和接口的易擴展性。通過實例,闡述了BREW通過虛擬函數表將接口與實現分離,使用ISHELL接口對多個接口支持及擴展。該方法與普通的C語言實現的接口相比較,修改接口而不會影響到應用程序,而接口有更好的可擴展性,更容易管理。
Abstract:
Key words :

摘  要: 為了說明BREW中如何實現用C語言來模擬C++中的面向對象的特性,實現接口的聲明與實現的分離、對多個接口的支持和接口的易擴展性。通過實例,闡述了BREW通過虛擬函數表將接口與實現分離,使用ISHELL接口對多個接口支持及擴展。該方法與普通的C語言實現的接口相比較,修改接口而不會影響到應用程序,而接口有更好的可擴展性,更容易管理。
關鍵詞: BREW;接口;面向對象

 如今,手機已不是簡單的語音通信工具,它已逐漸發展成為數據業務開發應用的平臺。在這種情況下,高通公司推出了一個新的BREW(Binary Runtime Environment for Wireless)平臺。BREW平臺的出現使手機像電腦一樣,可以應用更多的第三方軟件,滿足人們不同的需求,為用戶提供更多的服務。
在手機軟件開發中,許多問題都需要使用C++中面向對象的方法來實現,以提高代碼的可重用性、程序的模塊化及健壯性;為了滿足用戶對新數據應用的需求,移動設備制造商也希望不重新開發專有的軟件平臺,就可以快速提供新業務,以降低移動設備的技術門檻和產品上市門檻。
 高通公司推出的BREW平臺,為無線設備設計專門提供了一個高效的應用程序執行環境及開發平臺。在BREW平臺,用C語言開發應用程序可以達到C++的設計效果,而不需要開發專用的軟件平臺,又提高了程序開發的效率和新業務開發的速度。
本文通過一個例子,闡述BREW中如何實現接口的聲明和實現的分離來達到面向對象的特性,提高代碼的可重用性、健壯性以及其可擴展性和易于管理的特性。
1 BREW接口的實現
1.1 BREW平臺簡介

 BREW 的全稱是無線二進制運行環境。從基本的層面而言,BREW 平臺就是手持設備上嵌入式芯片操作系統的接口或抽象層,可以將它看作是 PC 環境下 Microsoft Windows 的 Win32 API。BREW 平臺是一組用于本地執行而編譯并鏈接的二進制庫,優化后能使應用程序利用無線服務和資源,控制流出或流入應用程序的事件流,能根據相應的事件啟動、停止、中止或恢復應用程序。BREW 執行環境在運行時可以發現應用程序和任何相關的擴展[1]。
1.2 嵌入式系統結構
 圖1是分散式系統結構圖。從圖1中可以看出,SDK需要使用運行平臺的接口聲明來開發應用程序,運行平臺負責根據用戶的輸入啟動應用程序,而應用程序則通過運行平臺的接口調用運行平臺的函數庫來實現功能[2]。

 假設程序運行到了需要調用平臺函數的時候,由于當前的應用程序是開發者使用SDK開發的,就像平臺不知道應用程序的地址一樣,應用程序也不知道平臺函數的地址,因此,所面臨的問題就是怎樣能夠知道應用程序中所調用的平臺函數的地址。雖然SDK中可以提供運行平臺中每個函數的地址,但是因為平臺會經常升級,導致每個函數的鏈接地址不固定,因此在平臺升級時,SDK和應用程序都需要同時升級。這樣就不能實現“分散式”的升級了,這種程序的運行方式也就沒有任何意義了。為解決分散式系統分散式升級的問題,BREW提供了一個機制來解決應用程序調用函數的問題。
 如果在開發過程中使用運行平臺的接口聲明,而在運行時應用程序使用真正的二進制接口,并在二進制層面調用接口函數[3]。則無論是SDK還是應用程序都與接口相關,解決這個問題的方式就是讓接口和接口的實現之間分離。下面介紹BREW中的接口是如何實現的。
1.3 軟件開發和C語言
 在C語言中, C語言庫的開發商開發了一個算法來實現字符串的搜索,為了實現這個功能,軟件廠商生成了一個頭文件FastString.h[4],內容如下:
typedef struct _IFastString
{
char *m_pString;
}IFastString;
void IFastString_CreateObject(IFastString *IFastString, char *pStr);//創建目標字符串對象
void IFastString_Release(IFastString *IFastString);
//釋放目標字符串對象
int IFastString_GetLength(IFastString *pIFastString);
//獲取目標字符串長度
int IFastString_Search(IFastString *IFastString, char *pSearchStr);//查找字符串,返回偏移量
 在BREW接口中共有4個接口:CreateObject、Release、GetLength、和Search。CreateObject用來創建IFastString接口,Release用來釋放接口的資源,GetLength用來獲取字符串長度,Search用來查找字符串。一般地,這個庫的使用者會將.lib庫鏈接到自己的工程中,通過接口聲明的頭文件來使用庫中的函數。這樣,庫函數將成為客戶應用程序中的一部分。
 假設FastString庫占用了1 MB的空間,如果4個程序中都調用了這個接口,則FastString接口將會占用4 MB的空間,也就是說有3 MB的空間浪費掉子。圖2是多個程序調用FastString庫的示意圖。另外,如果庫廠商發現接口有缺陷,又沒有辦法替換已經存在的缺陷代碼,一旦FastString接口鏈接到代碼中,就不可能在用戶設備上替換這部分代碼。因此,庫廠商不得不重新為每個應用程序的開發者廣播發布新的庫文件,并希望他們重新編譯程序來使用新的代碼。這在嵌入式系統中是不可能的。因為在這里FastString的角色就是運行平臺,不可能每個應用程序都包含一個運行平臺。解決這個問題的一種技術是使用動態鏈接庫技術將FastString包含起來。

 

 

1.4 動態鏈接庫
 動態鏈接庫技術的典型應用是Windows操作系統中的動態鏈接庫[4]。這種方法是將FastString源文件編譯成特殊的二進制文件,并強迫FastString將所有的接口從二進制文件中引用出去,建立相應的引出表,以便于在運行時把每個接口的名字映射到對應的二進制接口地址上。同時還需要為使用者生成相應的引入庫,使用者通過引入庫可以獲取每個接口的符號。當客戶鏈接引入庫時,這些符號信息會加入到當前的可執行文件中,運行時動態加載二進制庫文件,并在執行時調用相應的程序。這樣,即使多個程序調用FastString接口,FastString代碼也只需要一份,而且如果發現FastString代碼有缺陷時,可以更新FastString二進制組件而不影響應用程序。圖3是使用動態鏈接庫時多個程序調用FastString庫的示意圖。

1.5 虛擬函數表
 但是在嵌入式系統中一般不支持動態鏈接庫技術,因此在BREW中,采用虛擬函數表(VTBL)技術[4]實現接口和接口的分離。
 下面是新版本的FastString的頭文件:
typedef struct _IFastString IFastString;
typedef struct _IFastStringVtbl IFastStringVtbl;
typedef struct (*PFNCreateObject)
(IFastString **ppIFastString, char *pStr);
struct _IFastString
{
struct IFastStringVtbl *pvt;
};
struct IFastStringVtbl
{
        void(*Release)(IFastString*pIFastString);
        int(*GetLength)(IFastString*pIFastString);
        int(*Search)(IFastString*pIFastString,char *pSearchStr);
};
 #define IFASTSTRING_Release(p)((IFastString*)p->pvt)->Release(p) //釋放目標字符串對象
 #define IFASTSTRING_GetLength(p)((IFastString*)p->pvt)->GetLength(p) //獲取目標字符串長度
 #define IFASTSTRING_Search(p)((IFastString*)p->pvt)->Search(p) //查找字符串,返回偏移量
首先對FastString程序作一說明:在FastString頭文件里定義了IFastString和IFastStringVtbl兩個類型。IFastStringVtbl類型是虛擬函數表類型,IFastString中包含了指向虛擬函數表類型的指針。在接口定義時,使用((IFastString)p->pvt)調用虛擬函數表中的函數指針,這說明了如果要使用接口就必須先要提供IFastString的指針類型。可以看出,Release、GetLength和Find已經實現了在C語言定義的接口和實現函數之間的分離。
源文件FastString.c如下:
#include“FastString.h”
 #include<string.h>
  typedef struct _CFastString
 {
IFastStringVtbl *pvt;//指向虛擬函數表的指針
char *m_pString;//指向字符串的指針
int m_Len;//存儲字符串的長度
}CFastString;
//函數聲明
static void IFASTSTRING_Release(IFastString*pIFastString);
static void IFASTSTRING_GetLength(IFastString*pIFastString);
static void IFASTSTRING_Search(IFastString*pIFastString,char*pSearchStr);
 IFastStringVtbl gvtFastString = {IFASTSTRING_Release,
 IFASTSTRING_GetLength,
 IFASTSTRING_Search
};
void IFastString_CreateObject(...)
{...}
...
 CFastString結構體中有IFastStringVtbl類型的指針,而且這個指針在結構體的最頂部。另外還發現在IFastString結構體的最頂部也包含了IFastStringVtbl的指針,即CFastString是IFastString的超集。從而可以看出,CreateObject函數中返回的IFastString指針其實是指向CFastString的指針。在FastString.C源文件中還定義了一個IFastStringVtbl的變量gvtFastString,并為這個變量初始化成各個對應的函數,這個變量就是虛擬函數表。虛擬函數表的示意圖如圖4所示。

 可以發現,除了CreateObject成員之外,其余的三個成員函數(IFastString_Release、IFastString_GetLength、IFastString_Find)都添加到了虛擬函數表中,而且這個虛擬函數表還可以隨著需求的增加而進行無限擴大,這樣只用了一個函數CreateObject就實現了無限多個接口與實現之間的分離。
由于用戶需要使用CreateObject來獲取IFastString指針,因此將其與實現分離的方法是:因為應用程序的啟動過程,對于一個程序,無論是由main函數或者其他函數作為啟動函數,都允許啟動時傳遞參數,因此把這個CreateObject函數作為參數傳遞給應用程序就可以了。至此應用程序、接口和實現之間已經分離了。
1.6 支持多個接口和接口的擴展性
 實現了接口和實現之間的分離,但一個平臺不會只有一個接口,還包含了其他用途的接口。但又不能把所有接口的CreateObject作為參數傳遞給應用程序啟動函數,所以要對現有接口進行擴展來實現只要傳遞一個參數就能創建多個接口的功能。就像設計模式里面的工廠模式,創建一個專門的類用來創建別的類。因此,本設計采用增加一個稱為Shell的接口來管理其他接口。
在Shell接口中,定義了CreateInstance接口函數,其代碼如下:
static void IShell_CreateInstance(IShell *pIShell, int nClassID, void **ppObj, unsigned int nUserData)
{
...
switch(nClassID)
{
case CLASSID_FASTATRING:
        IFastString_CreateObject((IFastString**)ppObj,(char *)nUserData);
        break;
case ...
        ...
...
        }
}
 其作用是通過參數nClassID來創建指定的接口實例。IShell_CreateObject函數用來創建Shell接口本身,然后再通過Shell接口來創建其他接口。也就是說,在應用程序啟動時,先創建Shell接口,然后通過IShell_CreateInstance來創建其他接口。這樣,不但實現了接口的管理工作,而且方便了接口的擴展。
本文通過一個例子介紹了BREW中接口的實現,說明使用虛擬函數表能夠實現接口的聲明與實現的分離,從而當平臺升級或修改接口時不會影響應用程序,提高了CPU利用率,并使程序更加健壯。一個應用程序會使用很多接口,而Shell接口可以用來創建其他接口,使BREW接口有了很大的擴展性。使用C語言開發的BREW平臺具有面向對象的封裝性、繼承性和多態性。
參考文獻
[1] 陳秀寓.基于brew平臺的多態機制實現[J].軟件工程師,2010(2):104-106.
[2] 趙建祥,高禮中.基于BREW的手機軟件模塊設計[J].儀儀器儀表用戶,2009(5):47-49.
[3] 費寧.BREW實現機制深入分析[J].江蘇通信技術,2006(4):15-17.
[4] 焦玉海.深入BREW開發[EB/OL](2005-10-04)[2011-10-01]http://down.51cto.com/data/250317.

此內容為AET網站原創,未經授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
国产精品久久久久影院亚瑟| 亚洲人成网在线播放| 欧美gay视频激情| 久久精品1区| 欧美在线视频观看免费网站| 亚洲伊人网站| 中文欧美字幕免费| 中文成人激情娱乐网| 日韩午夜中文字幕| 亚洲欧洲偷拍精品| 欧美伦理影院| 蜜臀av在线播放一区二区三区| 久久精品欧美| 欧美伊人久久久久久久久影院 | 欧美一区二区三区视频免费| 亚洲一区在线播放| 亚洲一区免费观看| 午夜精品视频| 欧美一区二区三区免费看| 欧美一区二区三区另类| 久久精品国产亚洲a| 久久久久久久综合日本| 亚洲激情影院| 亚洲精品免费电影| 日韩午夜电影| 亚洲一区二区三区免费在线观看| 亚洲一区www| 亚洲第一成人在线| 亚洲福利在线看| 日韩写真视频在线观看| 在线一区亚洲| 新狼窝色av性久久久久久| 欧美一区日本一区韩国一区| 久久九九免费视频| 麻豆精品视频在线| 欧美日本簧片| 国产精品久久一区二区三区| 国产欧美日韩激情| 尤物99国产成人精品视频| 亚洲欧洲精品一区二区| 亚洲视频一区二区| 午夜精品久久久久久久男人的天堂 | 亚洲另类在线视频| 亚洲无吗在线| 欧美一区成人| 99re这里只有精品6| 亚洲夜间福利| 久久久久久久综合日本| 欧美精品福利在线| 国产精品影视天天线| 精品成人国产| 在线亚洲高清视频| 亚洲国产精品久久久| 一区二区三区久久网| 欧美一区午夜精品| 欧美激情精品久久久久久蜜臀| 欧美性jizz18性欧美| 国产亚洲欧美aaaa| 亚洲精品一区二区三| 亚洲欧美色一区| 日韩午夜在线视频| 久久超碰97中文字幕| 欧美国产亚洲另类动漫| 国产精品久久久久久亚洲调教 | 亚洲天堂av图片| 欧美中在线观看| 欧美精品一区二区高清在线观看| 国产精品综合久久久| 亚洲国产成人av在线| 99国内精品久久| 久久精品一区二区三区不卡| 一本大道久久精品懂色aⅴ| 午夜精品久久久久久久男人的天堂 | 性感少妇一区| 欧美激情精品久久久六区热门| 国产精品精品视频| 亚洲成人自拍视频| 亚洲欧美在线x视频| 亚洲乱码国产乱码精品精98午夜| 亚洲欧美另类国产| 欧美激情一区三区| 国内一区二区在线视频观看| 国产精品亚洲激情| 亚洲成色www8888| 亚洲欧美日韩高清| 宅男精品视频| 美女视频黄 久久| 国产精品日本| 亚洲伦理在线| 91久久综合| 久久亚洲精品一区| 国产精品视频一二三| 亚洲啪啪91| 亚洲第一久久影院| 欧美一进一出视频| 欧美日韩国产成人在线91| 韩日午夜在线资源一区二区| 在线中文字幕一区| 99re热这里只有精品免费视频| 久久另类ts人妖一区二区| 欧美精品日韩精品| 亚洲国产精品999| 欧美在线免费观看亚洲| 亚洲永久网站| 欧美日韩天天操| 亚洲国产精品欧美一二99| 久久国产黑丝| 久久国产精品亚洲va麻豆| 国产精品久久久久久久久久免费| 亚洲经典视频在线观看| 久久精品日韩欧美| 久久精品视频免费播放| 国产精品一区免费视频| 亚洲天堂成人在线观看| 亚洲午夜极品| 欧美日韩一区二区三区视频 | 日韩视频在线免费| 欧美成人一区二区三区| 悠悠资源网亚洲青| 亚洲国产欧美一区二区三区丁香婷| 久久精品亚洲| 国外精品视频| 亚洲国产精品v| 欧美aⅴ99久久黑人专区| 尤妮丝一区二区裸体视频| 亚洲高清视频在线| 麻豆九一精品爱看视频在线观看免费 | 欧美在线视频a| 久久精品国产99精品国产亚洲性色 | 亚洲另类自拍| 欧美欧美午夜aⅴ在线观看| 亚洲国内在线| 日韩午夜电影av| 久久国产日韩欧美| 国产在线欧美日韩| 久久精品国产一区二区三| 久久久噜噜噜久久中文字幕色伊伊 | 国产精品久久中文| 午夜亚洲福利| 久久影视三级福利片| 在线欧美视频| 在线一区二区三区四区| 国产精品va在线播放| 亚洲欧美日韩在线高清直播| 久久久蜜臀国产一区二区| 国内偷自视频区视频综合| 亚洲娇小video精品| 欧美久久成人| 亚洲在线中文字幕| 久久精品国产91精品亚洲| 国产一区二区三区在线观看免费| 欧美一区二区| 欧美阿v一级看视频| 亚洲精品欧美激情| 亚洲高清不卡av| 欧美区一区二| 亚洲影院色在线观看免费| 久久九九99视频| 亚洲区在线播放| 亚洲欧美久久| 在线成人黄色| 在线视频精品一区| 国产精品一二三四| 亚洲第一色在线| 欧美日一区二区在线观看 | 欧美www视频| 日韩一区二区精品视频| 欧美亚洲午夜视频在线观看| 国产一区二区三区在线观看免费视频| 亚洲黄一区二区三区| 欧美午夜精品久久久久久人妖| 亚洲免费一在线| 欧美成人日本| 亚洲无线视频| 老妇喷水一区二区三区| 一本色道久久综合亚洲二区三区| 欧美亚洲尤物久久| 亚洲国产你懂的| 亚洲福利视频在线| 国产精品久久久99| 亚洲国产婷婷香蕉久久久久久99| 欧美视频网址| 久久精品人人做人人综合| 欧美色大人视频| 久久国产一区二区| 欧美色综合天天久久综合精品| 欧美在线综合| 欧美午夜久久| 亚洲国产精品精华液2区45| 国产精品激情电影| 国产精品99久久久久久宅男| 麻豆成人综合网| 亚洲一区综合| 欧美精品一区二区视频| 欧美一级大片在线观看| 久久视频国产精品免费视频在线 | 亚洲天堂激情| 在线播放不卡| 久久高清免费观看| 亚洲作爱视频|