3650使用的Symbian系統(tǒng)是以Nokai為首的各手機廠商合伙開發(fā)的一個操作系統(tǒng),主要用于高端的智能手機。其開發(fā)語言為C++,可以使用Microsoft Visual C++ 6.0作為集成化的開發(fā)環(huán)境,看來雖然Symbian的目標是跟微軟的SmartPhone較勁,在采取的手段和方法上卻也是不拘一格,微軟更是暗暗叫苦,誰讓當時vc6設計的這么開放,結果被敵人拿去做武器了。本文主要針對的是Symbian開發(fā)入門,所以應該是非常簡單的事,因為畢竟Symbian的開發(fā)語言是C++,并不會因為是用于手機的操作系統(tǒng)就復雜了多少,就象很多人一直掛在嘴邊的J2ME也畢竟是java語言,并不會因為用在手機上就高深了多少一樣。
因為是用于手機的操作系統(tǒng),所以我們研究Symbian的話,研究Nokia的60系列平臺是一個很不錯的選擇,Nokia根據(jù)手機的屏幕大小和價格高低把手機分成了多個系列,60系列目前有兩款手機:7650和3650。60系列采用Symbian os 6.1,然后又根據(jù)手機屏幕的特點對UI做了一些修改,這個被修改了的Symbian就被稱為Nokia的60系列平臺。所以接下來的內容對7650同樣有用。
入門的第一步就是要下載S60的SDK,可以從Nokia的開發(fā)論壇上下載:http://www.asia.forum.nokia.com/chinese/sch/main/series60.html。
看Nokia網站上最新的是1.0,不過下面又有個0.9中文版,所以自然要下載這個0.9版了。100多兆吧,不想下的話,可以跟Nokia要光盤,估計他們應該很高興給。這個0.9中文版的模擬器是中文版的,而且有支持GBK和UNICODE轉換的類,不知道1.0的英文版有沒有。
下載完了就是安裝,選一個目錄裝就是了,不過最好裝在C盤上。可能是考慮到Windows平臺和Unix平臺都能用的緣故,這套SDK在處理盤符和目錄時比較弱智,我當時SDK裝到C盤,自己的程序放到D盤用vc6生成新項目就有問題,經觀察是盤符的問題。所以保險起見的話,最好裝在C盤,有興趣的可以替Nokia測試一下。另外,還需要Java的運行庫和Perl,SDK里也都帶了,不過他自帶的Perl在我的XP下裝有問題,我下載了一個最新的ActivePerl才最終算是安裝完畢。從SDK的安裝來看,這幫搞手機的搞軟件好像確實不太專業(yè),呵呵。
剛才說了,我的Symbian安裝到了C盤,在C盤的Symbian目錄下,有一個6.1的目錄,6.1目錄下有兩個目錄:Series60和Shared。還好,從名字上能看出大體的意思。請一定注意Series60目錄下的Epoc32/BUILD目錄,因為這個目錄以后要反復的用到。
接下來的任務就是要編譯一下HelloWorld,然后再運行一下看看了。首先得確認你的系統(tǒng)裝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/groupSymbian里,一個Project通常是按inc,src,group等目錄組織,group目錄里通常放的是項目文件,所以編譯時要先到這里。用命令提示符模式進入剛才說的那個目錄下,然后執(zhí)行 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文件。(實在理解不了為什么要這么搞?難道因為他們是生產手機的?)雖然它生成了這么多東西,但是我們不要管,繼續(xù)輸入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里創(chuàng)建新項目的話,要把 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函數(shù),還有就是很多的函數(shù)都有L或LC的后綴。其實這是Symbian的例外處理機制。比如說我們定義了一個指針,給它分配了空間,可是在使用它的時候程序突然間出現(xiàn)了致命錯誤中止了,那這個指針占用的地址空間我們肯定是收不回來了,在PC上編程這一點可能問題不大,內存那么多,而且用不了多長時間就重啟動了,但是Symbian的設計者可能認為這在手機上是不行的,所以對這一點做了很多的設計。
Symbian有一個Clean up stack,在使用指針時,用PushL把指針壓入棧中,使用完后在用Pop彈出棧,如果在中間調用可能導致崩潰的函數(shù)時果真出現(xiàn)了問題,那么Clean up stack可以通過調用該指針的析構函數(shù)回收占用的空間。這些可能導致崩潰的函數(shù)在Symbian里被稱為可能Leave的函數(shù),所以就在這些函數(shù)的尾部加了一個L。而加LC后綴的函數(shù)表明該函數(shù)已經在內部把指針用PushL壓入clean up stack了,調用時無需再用PushL,直接調用完用Pop既可。Clean up stack還提供了一個PopAndDestroy函數(shù),就是彈出棧后再銷毀指針。順便提一句,正式因為有了Clean up stack機制,所以Symbian在有些地方看起來跟VC的程序不太一樣,比如說很多類的構造函數(shù)都不用,用NewL或NewLC構造,分配地址時的操作符new()也變成了new(ELeave)。上述內容可以看一下Symbian編程基礎中的內存管理一節(jié)。
Symbian自己定義了一堆的數(shù)據(jù)類型,如果不想找麻煩的話,還是乖乖的用這些類型的好。簡單說一下,整型有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 *;緩沖區(qū)描述符(Buffer descriptor)是TBufC和TBuf,類似于char [];堆描述符是HBufC,類似于(char *)malloc(length+1)的用法。具體用時,上述的類型又分為8位的和16位的。舉個例子:
TBuf<64> buf;
CEikonEnv::Static()->ReadResource( buf, R_EXAMPLE_VIEW_TITLE );
先定義了一個最大長度是64的緩沖區(qū),然后讀入名為R_EXAMPLE_VIEW_TITLE的資源。
再例如:
TText8 *str = (TText8*)"示范窗口標題";
TPtrC8 source( str );
iInfoText = HBufC::NewL( source.Length() );
TPtr16 ptr = iInfoText->Des();
定義一個8位的字符串str,然后構造一個指針常量source,根據(jù)source長度再定義一個16位的指針,下一步我這里沒寫,但明顯著應該是把gbk的轉換為unicode了。
Symbian的資源文件一般是以rss為擴展名的,沒有專門的資源文件編輯器,用戶必須用記事本打開rss文件手工編寫rss文件。這個都有一定的規(guī)則和方法,參考例子不難編寫自己的資源文件。需要注意的一點是,如果資源文件里包含中文,那么必須把文件另存為utf-8格式的才可。
入門相對來說是比較簡單的,但精通就需要大量的實踐了。
早就想寫一篇這樣的文章了,但一直不知從何寫起,本文主要內容轉自賽迪網的一篇文章,因為看到一些機友對3650的深一步研究有興趣,所以轉了這篇文章,算是節(jié)省一點我的時間吧。需要說明的是:這只是一個簡單的入門介紹,對于用C++編程的朋友來說應該算不得什么。對于初學者來說,C++功能非常強大,但也相當復雜,過程是非常枯燥的,所以還是需要耐性和時間的。
另外,身邊不少朋友對JAVA比較感興趣,包括一些職業(yè)程序員也好象更喜歡開發(fā)JAVA方面的應用程序,我本人也對這方面更感興趣,以后有機會會為大家整理一些關于JAVA編程方面的內容的。
新聞熱點
疑難解答
圖片精選