Symbian入門

Symbian是一個操作系統,是以Nokai爲首的各手機廠商合夥攢的一個操作系統,主要用於高端的智能手機。其開發語言爲C++,可以使用Microsoft Visual C++ 6.0作爲集成化的開發環境,看來雖然Symbian的目標是跟微軟的SmartPhone較勁,在採取的手段和方法上卻也是不拘一格,微軟更是暗暗叫苦,誰讓當時vc6設計的這麼開放,結果被敵人拿去做武器了。

  本文只是爲了Symbian的開發入門,所以應該是非常簡單的事,因爲畢竟Symbian的開發語言是C++,並不會因爲是用於手機的操作系統就複雜了多少,就象很多人一直掛在嘴邊的J2ME也畢竟是Java語言,並不會因爲用在手機上就高深了多少一樣,只能是更簡單。5小時是我從對Symbian一無所知到完成本文化在Symbian上的所有時間。

  因爲是用於手機的操作系統,所以我們研究Symbian的話,先選定一款手機再說。Nokai的60系列平臺是一個很不錯的開始,Nokai根據手機的屏幕大小和價格高低把手機分成了多個系列,60系列目前有兩款手機:7650和3650。60系列採用Symbian os 6.1,然後又根據手機屏幕的特點對UI做了一些修改,這個被修改了的Symbian就被稱爲Nokia的60系列平臺。

  所以入門的第一步就是要下載S60的SDK,可以從Nokai的開發論壇上下載:http://www.asia.forum.nokia.com/chinese/sch/main/series60.html。看Nokai網站上最新的是1.0,不過下面又有個0.9中文版,所以自然要下載這個0.9版了。100多兆吧,不想下的話,可以跟Nokai要光盤,估計他們應該很高興給吧。這個0.9中文版的模擬器是中文版的,而且有支持GBK和UNICODE轉換的類,不知道1.0的英文版有沒有。

  下載完了自然就是安裝,選一個目錄裝就是了,不過最好裝在C盤上,可能是考慮到Windows平臺和Unix平臺都能用的緣故,這套SDK在處理盤符和目錄時比較弱智,我當時SDK裝到C盤,自己的程序放到D盤用vc6生成新項目就有問題,經觀察是盤符的問題。所以保險起見的話,最好裝在C盤,有興趣的可以替Nokai測試一下。另外,還需要Java的運行庫和Perl,SDK裏也都帶了,不過他自帶的Perl在我的XP下裝有問題,我下載了一個最新的ActivePerl才最終算是安裝完畢。從SDK的安裝來看,這幫搞手機的搞軟件好像確實不太專業。

  剛纔說了,我的Symbian安裝到了C盤,在C盤的Symbian目錄下,有一個6.1的目錄,6.1目錄下有兩個目錄:Series60和Shared。還好,從名字上能看出大體的意思。請一定注意Series60目錄下的Epoc32/BUILD目錄,因爲這個目錄以後要反覆的用到。

  接下來的任務就是要編譯一下HelloWorld,然後再運行一下看看了。首先得確認你的系統裝VC6了(最好能裝sp3以上,否則將來用到vc6時會報警),而且得把C:/Program Files/Microsoft Visual Studio/VC98/Bin放到你的PATH裏,主要是用nmake.exe。所以如果你有nmake的話,不裝vc6也可以看helloworld。

  找到helloword例子的目錄,在我這裏是C:/Symbian/6.1/Series60/Series60Ex/HelloWorld/group。Symbian裏,一個Project通常是按inc,src,group等目錄組織,group目錄裏通常放的是項目文件,所以編譯時要先到這裏。用命令提示符模式進入剛纔說的那個目錄下,然後執行

bldmake bldfiles

  這個命令會在group目錄下生成一個abld.bat的批處理文件,並且會在C:/Symbian/6.1/Series60/Epoc32/BUILD下生成C:/Symbian/6.1/Series60/Epoc32/BUILD/SYMBIAN/6.1/SERIES60/SERIES60EX/HELLOWORLD/GROUP這個深的一個目錄,並在最底層目錄下生成一堆.make文件。實在理解不了爲什麼要這麼搞?因爲他們是生產手機的?

  雖然它生成了這麼多東西,但是我們不要管,繼續輸入

abld build wins udeb

  這個命令會編譯我們的程序,最後在C:/Symbian/6.1/Series60/Epoc32/Release/wins/UDEB目錄下生成我們的helloworld,然後我們可以從開始菜單裏運行模擬器的debug版,打開other目錄就可以運行helloworld了。

  如果要在VC6裏編譯和運行HelloWorld,在運行完bldmake bldfiles後,運行abld makefile vc6,則會生成vc6的dsw文件,位置在C:/Symbian/6.1/Series60/Epoc32/BUILD/SYMBIAN/6.1/SERIES60/SERIES60EX/HELLOWORLD/GROUP/HELLOWORLD/WINS。看Symbian把這點事搞得這麼麻煩,也真是不容易。

  如果要直接在vc6裏創建新項目的話,要把C:/Symbian/6.1/Series60/Series60Tools目錄下的文件拷貝到vc6的模板目錄下纔可以。

  折騰到這裏,可能得花2個多小時吧,剩下的兩個多小時得看看文檔了。

  先看看HelloWorld的幫助文檔,理解一下Symbian程序的體系結構。Symbian程序也是按照VC的文檔視圖結構來組織程序的,有Application類CAknApplication,有Document類CAknDocument,有Frame類CAknAppUi,有視圖類CCoeControl等,跟vc的結構好像是差不多的,但感覺上它的Document類好像是做樣子的,我還沒看到這一塊。關於這些類之間的調用關係,在HelloWorld的文檔裏有個順序圖非常好,一看便知。

  在看Symbian的代碼時,感覺最不適應的可能就是經常看到PushL和Pop函數,還有就是很多的函數都有L或LC的後綴。其實這是Symbian的例外處理機制。比如說我們定義了一個指針,給它分配了空間,可是在使用它的時候程序突然間出現了致命錯誤中止了,那這個指針佔用的地址空間我們肯定是收不回來了,在PC上編程這一點可能問題不大,內存那麼多,而且用不了多長時間就重啓動了,但是Symbian的設計者可能認爲這在手機上是不行的,所以對這一點做了很多的設計。Symbian有一個Clean up stack,在使用指針時,用PushL把指針壓入棧中,使用完後在用Pop彈出棧,如果在中間調用可能導致崩潰的函數時果真出現了問題,那麼Clean up stack可以通過調用該指針的析構函數回收佔用的空間。這些可能導致崩潰的函數在Symbian裏被稱爲可能Leave的函數,所以就在這些函數的尾部加了一個L。而加LC後綴的函數表明該函數已經在內部把指針用PushL壓入clean up stack了,調用時無需再用PushL,直接調用完用Pop既可。Clean up stack還提供了一個PopAndDestroy函數,就是彈出棧後再銷燬指針。順便提一句,正式因爲有了Clean up stack機制,所以Symbian在有些地方看起來跟VC的程序不太一樣,比如說很多類的構造函數都不用,用NewL或NewLC構造,分配地址時的操作符new()也變成了new(ELeave)。上述內容可以看一下Symbian編程基礎中的內存管理一節。

  Symbian自己定義了一堆的數據類型,如果不想找麻煩的話,還是乖乖的用這些類型的好。簡單說一下,整型有TInt和TUint,其中又分爲8位的,16位的和32位的,如TInt8,TInt16,TInt32;文本類型是TText,又細分爲TText8和TText16,但內部都是Unicode的,所以實際上內部引用應該都是TText16;bool型是TBool,對應的值有ETrue和EFalse;浮點型是TReal,但又分爲TReal32和TReal64;還有一個引用類型TRefByvalue<T>,是以模板類的形式提供的。

  因爲Symbian是衝着更面向對象設計的,所以在我們常見的字符串這塊變化比較大,在Symbian裏叫descriptor。最底層的是兩個抽象類TDesC和TDes,實際上TDes也是繼承的TDesC,TDesC中的C字母是常量constant的意思。即帶C字母結束的都是定義的常量,是不可以修改的,而不帶C的都有一個最大長度的限制,是可以修改的,下面也是同樣的道理。指針描述符是TPtrC和TPtr,類似於C++中的char *;緩衝區描述符(Buffer descriptor)是TBufC和TBuf,類似於char [];堆描述符是HBufC,類似於(char *)malloc(length+1)的用法。具體用時,上述的類型又分爲8位的和16位的。舉個例子:

TBuf<64> buf;
CEikonEnv::Static()->ReadResource( buf, R_EXAMPLE_VIEW_TITLE );

  先定義了一個最大長度是64的緩衝區,然後讀入名爲R_EXAMPLE_VIEW_TITLE的資源。

  再例如:

TText8 *str = (TText8*)"示範窗口標題";
TPtrC8 source( str );
iInfoText = HBufC::NewL( source.Length() );
TPtr16 ptr = iInfoText->Des();

  定義一個8位的字符串str,然後構造一個指針常量source,根據source長度再定義一個16位的指針,下一步我這裏沒寫,但明顯着應該是把gbk的轉換爲unicode了。

  Symbian的資源文件一般是以rss爲擴展名的,沒有專門的資源文件編輯器,用戶必須用記事本打開rss文件手工編寫rss文件。這個都有一定的規則和方法,參考例子不難編寫自己的資源文件。需要注意的一點是,如果資源文件裏包含中文,那麼必須把文件另存爲utf-8格式的纔可。
發佈了22 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章