色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          Symbian 入門

          作者: 時間:2016-09-12 來源:網(wǎng)絡(luò) 收藏

          這學(xué)期專業(yè)實(shí)踐要做一個關(guān)于 S60的手機(jī)軟件,所以我選擇了CarbideV1.2 OEM和S60 SDK 3rd FP1來作為自己的開發(fā)環(huán)境,具體的環(huán)境搭配如下:

          本文引用地址:http://cafeforensic.com/article/201609/303390.htm

          1.首先安裝Carbide,選擇OEM版本,至于License的話在網(wǎng)上可以查的出來,大家自己去找,然后會出現(xiàn)release_notes提示安裝Perl和SDK等.

          2.安裝Perl,選擇activeperl 5.6.1的版本安裝,否則會出現(xiàn)下面的網(wǎng)絡(luò)上面常見的問題:

          使用Carbide用向?qū)陆?a class="contentlabel" href="http://cafeforensic.com/news/listbylabel/label/Symbian">Symbian OSC++ Project,選擇3rd Ed. GUI Application模版,根據(jù)步 驟建立了工程,選擇Emulator Debug,編譯時出現(xiàn)下如問題:

          make[1]: *** No rule to make target `9.2S60_3rd_FP1_2EPOC32BUILDSymbiancarbideworkspacetestgroupTESTWINSCWTEST.WINSCW'. Stop. test line 0這樣的問題,如果選擇5.6.1 的話就不會出現(xiàn)上面的問題。(所以軟件不是最新版本就是最好的阿!).

          3.安裝SDK最好在他的默認(rèn)目錄,而且這幾個都是最好在一起,我選擇的是C盤安裝軟件和操作系統(tǒng),給了35G的大小。D盤存取數(shù)據(jù)。所以這些我都是安裝在他的默認(rèn)目錄下面。Carbide和Perl 安裝在C 盤program files.SDK 就直接安裝在了C盤上面了。這樣的話基本上就差不多了。

          4.打開Carbide,要將工作的空間選取在和自己安裝carbide的盤符相同的盤下面。否則的話會出現(xiàn)下面的錯誤:

          WARNING: EPOCROOT does not specify an existing directory

          BLDMAKE ERROR: Directory Symbian9.2S60_3rd_FP1EPOC32 does not exist

          上面的是我在配置Symbian開發(fā)環(huán)境時候的一點(diǎn)經(jīng)驗(yàn)之談,希望能夠?qū)Υ蠹矣幸恍椭矚g迎大家給與指教,給我這個菜鳥一些幫助,在此先感謝大家了。

          PS:我是一個菜鳥,也是剛開始學(xué)習(xí)Symbian開發(fā)相關(guān),所以對Symbian開發(fā)不太了解,之所以在這里寫博客是我發(fā)現(xiàn)里面有很多Symbian開發(fā)的高手,所以希望大家能夠給與我一些幫助,在此再次感謝了!!~-~

          ----------------------------------------------------------------------------------------------------

          開發(fā)軟件來編譯程序,編寫程序。即Integrated Development Environment (IDE) ,它包括編輯器,編譯器和連接器。

          推薦用Nokia’s Carbide.c++ Express Edition (based on the Eclipse IDE)或者Visual Studio .NET 2003。

          需要軟件開發(fā)工具包,即Software Development Kit (SDK),它允許你寫,創(chuàng)建程序?yàn)槟愕氖謾C(jī)。

          對N73,需要S60 2nd Edition FP2version 9.1 introduced a complete break from older versions.

          To work on Symbian OS version 9.1 or later, applications must be slightly modified andrecompiled.

          不同的Symbian os用戶界面user interface (UI)是不一樣的。因此要選擇正確的SDK。

          • S60 3rd Edition Feature Pack 1 - Symbian OS v9.2

          • S60 3rd Edition - Symbian OS v9.1

          • S60 2nd Edition Feature Pack 3 - Symbian OS v8.1

          • S60 2nd Edition Feature Pack 2 - Symbian OS v8.0a

          • S60 2nd Edition Feature Pack 1 - Symbian OS v7.0s

          enhanced

          • S60 2nd Edition - Symbian OS v7.0s

          • S60 1st Edition - Symbian OS v6.1

          由于我們的os是v9.1的,所以需要S60 3rd Edition。

          可以在http://developer.symbian.com/main/tools/sdks/s60/index.jsp上下載

          下載IDE CodeWarrior Development Studio for Symbian os 3.1(OEM,Professional and Personal)

          下載地址為:http://www.forum.nokia.com/info/sw.nokia.com/id/4d2d8611-c490-4f6e-a931-

          ea37ba4f040d/CodeWarrior_Development_Studio_for_Symbian_OS_Personal_Edition_Version_3_1.html

          安裝其個人版,可試用90天。

          安裝SDK

          驗(yàn)證SDK的安裝

          1、用devices命令設(shè)置S60 3rd Edition SDK for Symbian OS for C++ 作為默認(rèn)的設(shè)備

          例如:devices -setdefault @S60_3rd:com.nokia.S60

          2、到包含helloworldbasic的目錄下 默認(rèn)安裝下為cd C:Symbian9.1S60_3rdS60Exhelloworldbasic

          3、再進(jìn)到group目錄下,該目錄下包含bld.inf和helloworldbasic.mmp文件

          4、驗(yàn)證編程環(huán)境

          運(yùn)行—〉輸入cmd—〉輸入epoc—〉出現(xiàn)模擬器則表示安裝成功。

          注:參看Getting_Started_final.pdf

          -------------------------------------------------------------------------------------------------------------------------

          Nokia根據(jù)手機(jī)的屏幕大小和價(jià)格高低把手機(jī)分成了多個系列,現(xiàn)在使用的系列有:Series 40、Series 60、Series 80 和Series 90。60系列

          采用Symbian os 6.1,然后又根據(jù)手機(jī)屏幕的特點(diǎn)對UI做了一些修改,這個被修改了的Symbian就被稱為Nokia的60系列平臺。使用60系列的手

          機(jī)型號包括:Nokia 6670、 Nokia 6630、 Nokia 6260 、Nokia N-Gage QD™ 、Nokia 7610 、Nokia 6620 、Nokia 3620 、Nokia 3660 、

          Nokia 6600 、Nokia 3600、Nokia 3650、Nokia 7650、Nokia N-Gage™等。

          下面我們就以60系列為例,介紹SDK的安裝過程。

          2.1.1 安裝SDK

          第一步,到Nokia論壇注冊,下載最新的SDK。Nokia 網(wǎng)站提供的Series 60 SDK for Symbian OS Nokia Edition SDK最新版本是v1.2,Series

          60 SDK for Symbian OS的最新版本是v2.1。下載網(wǎng)址:http://www.forum.nokia.com/main/0,6566,034-4,00.html

          第二步,到http://www.activestate.com 網(wǎng)站下載最新的Active Perl Script 安裝程序。到http://www.java.com/en/download/manual.jsp

          下載最新的J2RE。

          第三步:安裝SDK,推薦為Symbian開發(fā)單獨(dú)建一個目錄,例如d:Symbian而不是使用C:program files等這樣的目錄。

          第四步:安裝Active Perl和J2RE,安裝到默認(rèn)目錄即可。

          第五步:檢查環(huán)境變量設(shè)定。打開系統(tǒng)環(huán)境變量tab,然后看看有沒有EPOCROOT,如果有的話,把它手動改成“” 。改完之后應(yīng)該是這個樣子

          的:

          EPOCROOT =

          然后,在系統(tǒng)PATH中加入 epoc32tools目錄以及epoc32gccbin目錄就可以了。

          實(shí)際上,Symbian SDK根本不用安裝,直接把epoc32目錄拷貝到一個機(jī)器上,然后照上述方法設(shè)定目錄和環(huán)境變量就可以了。

          2.1.2 配置VC

          如果我們使用的是VC 6.0,我們要保證系統(tǒng)至少打了SP3補(bǔ)丁,否則系統(tǒng)會有警告提示。如果我們使用的是VS.NET2003, 我們就只能安裝Series

          60 SDK for Symbian OS v2.1,因?yàn)镾eries 60 SDK for Symbian OS Nokia Edition SDK v1.2在VS.NET2003無法正確建立工程。

          如果要直接在vc6里創(chuàng)建新項(xiàng)目,要把Symbian6.1Series60Series60Tools Application Wizard目錄下的 AvkonAppWiz.awx和

          AVKONAPPWIZ.HLP文件拷貝到vc6的模板目錄C:Program Files Microsoft Visual Studio Common MSDev98 Template下。這樣我們就可以

          在VC的新建工程中看到Series 60 AppWizard v 1.9這個選項(xiàng).

          填入Project Name 以后,確認(rèn)。

          一路“Next”,一個最簡單的Symbian應(yīng)用程序就建立好了。

          如果要將已經(jīng)建立好的工程導(dǎo)入到VC6.0中,比如我們將SDK中的例子HelloWorld轉(zhuǎn)換成一個VC6的項(xiàng)目,我們首先進(jìn)入Symbian6.1Series60

          Series60ExHelloWorld目錄。在這里我們可以看到,在Symbian中,一個Project通常是按inc, src, group等目錄組織,group目錄里通常放

          的是項(xiàng)目文件,所以編譯時要先到這里。用命令提示符模式進(jìn)入剛才說的那個目錄下,然后執(zhí)行:

          bldmake bldfiles

          這個命令會在group目錄下生成一個abld.bat的批處理文件,并且會在Symbian 6.1Series60Epoc32BUILD下生成Symbian6.1Series60

          Epoc32BUILDSYMBIAN6.1 SERIES60SERIES60EXHELLOWORLDGROUP這個目錄,并在最底層目錄下生成一堆 .make文件。

          然后,我們在同一個目錄運(yùn)行剛才生成的abld.bat:

          abld makefile vc6

          這樣就會自動生成vc6的dsw文件,位置在Symbian6.1Series60Epoc32BUILD SYMBIAN6.1 SERIES60

          SERIES60EXHELLOWORLDGROUPHELLOWORLDWINS。然后我們就可以在VC6種打開這個Symbian工程了。

          2.2 編譯

          我們可以直接使用SDK提供的工具編譯Symbian 工程,也可以使用VC6提供的集成環(huán)境來編譯轉(zhuǎn)化過的Symbian 工程。編譯的結(jié)果存放在

          Symbian6.1Series60Epoc32 ReleasewinsUDEBZSYSTEMapps目錄中。

          2.2.1使用SDK提供的工具編譯Symbian 工程

          我們在上一節(jié)的那個位置繼續(xù)輸入:

          abld build wins udeb

          這個命令會編譯我們的程序,最后在Symbian6.1Series60Epoc32ReleasewinsUDEB目錄下生成我們的helloworld,然后我們可以從開始

          菜單里運(yùn)行模擬器的debug版,在模擬其中就可以運(yùn)行helloworld了。

          2.2.2 使用VC6編譯Symbian 工程

          我們直接打開運(yùn)行abld makefile vc6后生成的dsw文件,VC自動裝載轉(zhuǎn)化過的工程。按F7便可以直接編譯工程,編譯結(jié)果同樣放在

          Symbian6.1Series60Epoc32Release winsUDEB目錄中。然后我們打開模擬器debug 版,就可以看到我們編譯好的工程了。

          2.3 打包

          我們以SDK 1.2提供的HelloWorld為例,制作可以在手機(jī)中安裝的.SIS文件:

          2.3.1.檢查程序

          首先,在命令行格式下,進(jìn)入HelloWorld工程mmp文件所在目錄,輸入bldmake bldfiles和abld build wins udeb,然后打開模擬器,檢測程序

          有無錯誤。

          2.3.2.編譯工程

          在程序無錯誤后,在命令行輸入abld build armi urel 。執(zhí)行這個命令之后會在目錄d:symbian6.1series60epoc32releasearmiurel生

          成HELLOWORLD.APP和HELLOWORLD.RSC兩個文件。

          2.3.3.建立.pkg文件

          在d:Symbian6.1Series60Series60Exhelloworldsis 用記事本建立或者修改工程的pkg文件,內(nèi)容如下:

          ; HelloWorld.pkg

          ;

          ;Language - standard language definitions

          EN

          ; standard SIS file header

          #{HelloWorld},(0x10005B91),1,0,0

          ;Supports Series 60 v 1.2

          (0x101F8202), 0, 0, 0, {Series60ProductID}

          ;

          d:symbian6.1series60epoc32releasearmiurelHelloWorld.APP-!:systemappsHelloWorldHelloWorld.app

          d:symbian6.1series60epoc32releasearmiurelHELLOWORLD.rSC-!:systemappsHelloWorldHELLOWORLD.rSC

          其中,前面d:symbian6.1series60epoc32releasearmiurelHELLOWORLD.rSC是要打包安裝的文

          件,!:systemappsHelloWorldHELLOWORLD.rSC是安裝的目標(biāo)位置。在其中要注意的是,我們在目標(biāo)位置中用“!”代替了實(shí)際的盤符。

          這樣做得好處是在用戶安裝的時候,手機(jī)系統(tǒng)會提示用戶選擇要安裝的位置,這就給了用戶更大的靈活度。另外,在Symbian 系統(tǒng)中,安裝的

          應(yīng)用程序默認(rèn)位置是“!:systemapps ”。

          編輯好pkg文件后,保存至相應(yīng)目錄。

          2.3.4.打包程序

          在命令行中,轉(zhuǎn)至pkg文件所在目錄,運(yùn)行命令makesis HelloWorld.pkg。之后我們就在同一目錄下得到了打包好的.sis文件。

          2.4 手機(jī)測試

          將打包好地.sis文件上傳至手機(jī)中,然后在手機(jī)的應(yīng)用程序管理器中就可以看到我們打包好的文件。選擇“安裝”命令,系統(tǒng)會提示用戶要安

          裝的位置,選擇安裝位置后,我們制作的應(yīng)用程序就安裝到手機(jī)中了。

          我們回到手機(jī)的主菜單,就會發(fā)現(xiàn)新安裝的HelloWorld 應(yīng)用程序。打開運(yùn)行,結(jié)果和在模擬器中看到的基本是一樣的。

          ---------------------------------------------------------------------------------------------------------------------

          第一篇:Symbian UI 程序框架

          Symbian UI 程序的框架基本上是統(tǒng)一的。大家只要學(xué)習(xí)一種簡單的框架就可以進(jìn)行大部分的Symbian開發(fā)了。我這里先介紹一個概念。

          1.1 MVC 架構(gòu)

          Symbian 基本上使用MVC架構(gòu)來搭建控件。Symbian UI程序設(shè)計(jì)主要講究的也是如何使用控件。而No kia沒有做好的一個方面就是有關(guān)UI

          Control的幫助太少了。SDK提供的幫助里面根本就沒有資源文件的寫法。這一張里面我會介紹一些控件例如Dialog,Text Listbox等等資源文

          件的寫法。同時也會告訴大家應(yīng)該到SDK的哪里才能找到這些資源的描述。

          但是首先,我先介紹一下MVC架構(gòu)。MVC并不是個新東西。他是Model - View - Control的縮寫。在以前smalltalk中就已經(jīng)開始用了。其主要的

          想法是在構(gòu)造類的時候把顯示,控制以及模型分開。Symbian對其作了小的改動。在Nokia提供的Series 90控件組(就是CKON,以后我再提CKON

          的時候大家要知道指得是S90的控件)中Model主要用來存儲數(shù)據(jù),以及封裝對數(shù)據(jù)的操作。也就是對于對象實(shí)體的操作。View當(dāng)然是負(fù)責(zé)顯示

          。Control被抽象成一個或多個純虛類(Mixin)其它對象通過重寫虛函數(shù)來得到對象內(nèi)部的狀態(tài)以及控制對象。Series 90的Text Listbox類

          CEikTextListBox很好的說明了這個構(gòu)架。比如你可以調(diào)用CEikTestListBox中的Model()函數(shù)得到一個Model的指針,然后你就可以訪問其中的

          CDesArrayFlat數(shù)組了。

          1.2 Symbian的工程文件

          1.2.1工程引導(dǎo)文件bld.inf

          這個東東其實(shí)就是一個腳本,它告訴Build環(huán)境在做Build之前需要準(zhǔn)備或知道一些什么東西。最普通的

          一種寫法是:

          PRJ_MMPFILES

          project.mmp

          這是告訴Build環(huán)境:你馬上要處理的工程文件名字叫project.mmp。大家如果做比較復(fù)雜的程序可能需要同時Build所有的庫,那么就在這里把

          你所有需要Build的工程都列出來:

          PRJ_MMPFILES

          project.mmp

          project_lib1.mmp

          project_lib2.mmp

          另外的一個常用的標(biāo)記是PRJ_PLATFORMS這個東東告訴編譯環(huán)境,以下的這些平臺(Targets)是需要編譯的。你可以在這個標(biāo)記的下一行列出

          需要的平臺例如:

          PRJ_PLATFORMS

          WINS ARMI WINSCW

          或者直接用

          PRJ_PLATFORMS

          DEFAULT

          注意,如果你不作PRJ_PLATFORMS這個標(biāo)記其效果等于PRJ_PLATFORMS DEFAULT,所以這個不是必須

          的。

          第三個常用標(biāo)記是PRJ_EXPORTS這個東西告訴編譯環(huán)境在編譯之前需要把哪些文件先拷貝到指定位置。我舉個簡單的例子大家就知道什么意思了

          。比如你的工程中需要include一個第三方的*.inl的文件,那么如果編譯之 前這個文件不存在就會編譯不過。你可以這么寫:

          PRJ_EXPORTS

          .nk_set.inl epoc32include

          那么在你編譯的時候,一個Perl腳本會先把你工程目錄下的nk_set.inl文件拷貝到epoc32include目錄下,然后再 編譯工程。

          大多數(shù)工程只要用這三個標(biāo)記就可以了。還有一點(diǎn)小技巧這個bld.inf文件中是可以寫#if #else 等等東西的。

          比如:

          #if defined(WINS)

          ..... 注意沒有{}

          #else

          .....

          #endif

          ---------------------------------------------------------------------------------------------------------------------

          Avkon Series60 extensions and modifications to Symbian's Uikon and other parts of the Symbian OS Application Framework

          Symbian中的應(yīng)用程序通常分為兩個部分,engine和UI,如此的劃分增加了可維護(hù)性和靈活性,engine就好象是程序的核心,它主要處理運(yùn)算和

          數(shù)據(jù),而UI(應(yīng)該是User Interface)主要處理數(shù)據(jù)的顯示和所有行為(操作行為應(yīng)該是)。

          engine不談,它是程序起作用的靈魂,這個是因程序而異的,我們來看應(yīng)用程序外觀,它可以分為三種體系結(jié)構(gòu):

          一、傳統(tǒng)的symbianOS控制體系結(jié)構(gòu)

          二、基于對話框的體系結(jié)構(gòu)

          三、視圖體系結(jié)構(gòu)

          看看好象跟MFC搞的似的,也有個View和Dialog,不過也是Symbian就是用C++寫的,面向?qū)ο筇匦苑浅:谩?/p>

          運(yùn)用什么樣的界面取決于程序和界面布局的需要,就不多說了。只是不管你使用哪種,都是從一個基類繼承而來的,就好象是CView一樣。

          [傳統(tǒng)SymbianOS應(yīng)用程序的體系結(jié)構(gòu)]

          傳 統(tǒng)意義上,SymbianOS應(yīng)用程序是在CCoeControl類的基礎(chǔ)上派生出我們自己的view controls,這些都存放在應(yīng)用程序的 control stack中

          ,也就是我們應(yīng)用程序的視圖。這些controls會根據(jù)應(yīng)用程序的需要來創(chuàng)建釋放或顯示隱藏,以產(chǎn)生相應(yīng)的操作。

          [Dialog體系結(jié)構(gòu)]

          如果主體應(yīng)用是對話框,那我們更應(yīng)該使用這樣的體系結(jié)構(gòu),使用dialogs的好處是我們光可以靠改變r(jià)esource文件來修改內(nèi)容和布局,而不需

          要重新編譯那c++代碼。

          注意,如果不小心規(guī)劃,那嵌套的對話框?qū)⒑娜ゴ罅康亩褩?臻g。

          另外,如果dialog體系結(jié)構(gòu)被用于主要視圖,那建議講其設(shè)計(jì)為非模態(tài)對話框。(它不壟斷用戶的輸入,用戶打開非模態(tài)對話框后,仍然可以與

          其它界面進(jìn)行交互。)如果你要生成一個主界面對話框,要求是滿屏,并提供多頁設(shè)計(jì),那應(yīng)該包括如下features:

          RESOURCE DIALOG r_dlgapp_main_dialog

          {

          flags = EEikDialogFlagNoDrag | EEikDialogFlagNoTitleBar |

          EEikDialogFlagFillAppClientRect |

          EEikDialogFlagCbaButtons | EEikDialogFlagModelss;

          buttons = r_dlgapp_softkeys_options_home;

          pages = r_dlgapp_main_pages;

          }

          如果要創(chuàng)建一個對話框應(yīng)該如下:

          void CDlgappAppUi::ConstructL()

          {

          BaseConstructL();

          iAppView = new(ELeave) CDlgAppMainView;

          iAppView->ExecuteLD(R_DLGAPP_MAIN_DIALOG);

          AddToStackL(iAppView);

          }

          ExecuteLD()在調(diào)用后立即返回,并且對話框必須要加到control stack中——使用AddToStack函數(shù),因?yàn)榉悄B(tài)對話框不會自己處理這些。

          [View體系結(jié)構(gòu)]

          使用view的應(yīng)用程序每次只能有一個活動的view,當(dāng)另一個view要激活時,當(dāng)前的view就要被釋放。當(dāng)一個view被釋放后,所以的菜單,對話

          框以及包含的應(yīng)用都將被關(guān)閉。

          每 個view都被當(dāng)作一個應(yīng)用UI對待,它必須提供一個Id()函數(shù)以便為系統(tǒng)所標(biāo)識,它也要重載DoActivateL(),DoDeactivate

          (),HandleForegroundEventL(),HandlCommandL()和HandleStatusPaneSizeChange() 函數(shù)以處理各種事件。

          下面一個個的看

          DoActivateL()

          當(dāng)客戶端要求你的view激活時,它就要被調(diào)用。 client可能發(fā)送消息參數(shù)給你的view,如果你的view已經(jīng)是激活了,那只有當(dāng)client明確要求

          再次激活時才被調(diào)用,所以你的 DoActivateL()實(shí)現(xiàn)得應(yīng)付這種情況,ie已經(jīng)激活了view。如果你不打算顯示view或者你的view不想處理任何

          消息,那一個簡單的檢查 和return即可。

          DoDeactive()

          這個函數(shù)當(dāng)你的view被注銷時調(diào)用,view被注銷時通常有兩種情況:一是你的應(yīng)用程序要退出了,二是相同程序里另一個view要被激活。這個

          函數(shù)很重要,咱們可不能忘記了:)

          HandleForegroundEventL()

          這 個函數(shù)主要是在你的view被激活時調(diào)用(即在DoActivateL()和DoDeactivate()之間被調(diào)用)。當(dāng)你的view在前臺時,它將是

          HanleForegroundEvent(ETrue),當(dāng)你的view移出前臺時,它將為HandleForegroundEvent (EFalse),只有當(dāng)前臺狀態(tài)確實(shí)改變時這個函數(shù)才會

          被調(diào)用。

          HandleCommandL()

          當(dāng)view菜單產(chǎn)生一個命令后本函數(shù)將被調(diào)用。

          HandleStatusPaneSizeChange()

          當(dāng)client的尺寸由于status pane而改變時,本函數(shù)被調(diào)用了就。

          下面是一個view在接受事件的典型調(diào)用順序

          1.DoActivateL()

          2.HandleForegroundEventL(ETrue)

          3.HandleForegroundEventL(EFalse)

          4.DoDeactivate()

          其中一對HandleForegrounEventL在view被激活的過程中會發(fā)生多次調(diào)用。

          而DoActivateL()在DoDeactivate()被調(diào)用前可能會被多次調(diào)用。

          View Resources

          如果你要使用view來顯示pages,那唯一的途徑是創(chuàng)建出自己的AVKON_VIEW資源,里面有自己的CBA和菜單,把這個資源的id傳遞給view的

          BaseContructL()函數(shù)即可。

          RESOURCE AVKON_VIEW r_viewapp_view1

          {

          hotkeys = r_viewapp_hotkeys;

          menubar = r_viewapp_view1_menubar;

          cba = R_AVKON_SOFTKEYS_OPTIONS_BACK;

          }

          注意如果沒有給定的menubar資源,那就會使用確省的系統(tǒng)menubar

          Construction

          下面這個例程是用的AppUI object's ConstructL來構(gòu)造出view的,使用了AddView來登記,最后把第一個創(chuàng)建的view做為缺省的view了:

          void CMyViewArchAppUi::ConstructL()

          {

          BaseConstructL();

          CMyViewArchAppView1* view1 = new(ELeave) CMyViewArchAppView1;

          CleanupStack::PushL(view1);

          view1->ConstructL();

          AddViewL(view1); //Add view1 to CAknAppUi; transfers ownership

          CleanupStack::Pop();

          CMyViewArchAppView2* view2 = new(ELeave) CMyViewArchAppView2;

          AddViewL(View2); // transfer ownership to CAknAppUi

          CleanupStack::Pop();

          CMyViewArchAppView3* view3 = new(ELeave) CMyViewArchAppView3;

          AddViewL(View2); // transfer ownership to CAknAppUi

          CleanupStack::Pop();

          SetDefaultViewL(*view1);

          .......(more code)

          要讓view發(fā)揮作用(注意,一個view自身是沒有繪圖能力的),它必須擁有得到一個從CCoeControl派生的containers,譬如

          class CMyViewArchAppView1Container: public CCoeControl, MCoeControlObserver

          下面這個例程將展現(xiàn)編程者自己的CAknView派生類

          class CMyViewArchAppView1: public CAknVIew

          {

          .....

          private:

          CMyViewArchAppView1Container* iVIew;

          }

          大家可以看出App里產(chǎn)生了View,View類中有我們必須的Container.

          當(dāng)前激活的view在HandleCommandL()處理命令,這些是自定義功能鍵和菜單所生成的命令。

          void CMyAppView1::HandleCommandL(TInt aCommand)

          {

          switch (aCommand)

          {

          case EMyAppCmdSwitchView:

          AppUi()->ActivateLocalViewL(KView2Id);

          break;

          case EAknSoftKeyOk:

          {

          ......

          break;

          }

          case EAknSoftKeyBack:

          {

          ((MEikCommandObserver*)AppUi())->ProcessCommandL(EEikCmdExit);

          break;

          }

          default:

          AppUi()->HandleCommandL(aCommand);

          break;

          }

          }

          Local View Switching

          如果你要切換view,你得提供view的UID

          //Now switch the view to view2

          iAvkonViewAppUi->ActivateLocalViewL(TUid::Uid(2));

          事實(shí)上,每個view都有自己的菜單系統(tǒng),如果你要使用它,應(yīng)當(dāng)在AVKON_VIEW資源結(jié)構(gòu)中設(shè)置,前面已經(jīng)講過了。

          而且不管怎么說,如果要使用系統(tǒng)菜單,它的內(nèi)容在切換之前是一定要更新一次的。

          //Switch to a new menu system for the new view

          iEikonEnv->AppUiFactory()->MenuBar()->SetMenuTitleResourceId(R_MY_VIEW_ARCH_APP_VIEW2_MENU);

          //Now swtich the view to view2

          如果要進(jìn)行遠(yuǎn)程的視圖切換,那就要調(diào)用CCoeAppUi::ActivateViewL()函數(shù),并傳遞了一個包含目標(biāo)應(yīng)用程序UID和目標(biāo)視圖UID的TVwsViewId

          Leave recovery

          Avkon 視圖體系結(jié)構(gòu)在DoActivateL()退出時會有個自動的回復(fù)機(jī)制。系統(tǒng)會調(diào)用DoDeactivate()在當(dāng)前view離去時,回復(fù)前一個 view,并把

          用戶帶到之前他們所在的地方。如果程序并沒有前一個view的存在,那它就會退出,如果程序前個view就是當(dāng)前的view(也就是說他們 是重激

          活的),則應(yīng)用程序會試圖恢復(fù)缺省的view.

          說了這么多,那我們在什么情況下采用合適的體系結(jié)構(gòu)那?下面的內(nèi)容將會有所幫助。

          使用傳統(tǒng)的SymbianOS體系結(jié)構(gòu),你要花費(fèi)大量的時間研究代碼是怎么工作的,但大部分交互和錯誤處理的引擎代碼都是現(xiàn)成,可以降低你的開

          發(fā)難度。

          Do you have an acyclic graph shaped navigation structure?

          如果你視圖程序中的navigation能夠as an acyclic gragh,那最好使用dialog體系結(jié)構(gòu)。

          Are all the application screens dialog like?

          如果你的應(yīng)用程序想使用對話框,那建議你使用dialog體系結(jié)構(gòu),注意如果要有一個選擇列表,那最好寫成包含在dialog中的選擇列表。

          Does the application have multiple views or modes, which deal with different sorts of data at the top level?

          如果是這樣,那最好使用傳統(tǒng)或view體系結(jié)構(gòu)。

          Do external applications need to switch to different views of your application?

          如果是采用view體系結(jié)構(gòu)寫的程序,那它一定支持多個不同的view,而且是外部程序能訪問的。如果你從頭開始寫一個應(yīng)用程序,那建議你使

          用view體系結(jié)構(gòu),

          否則給我看看有沒有現(xiàn)成的代碼可利用,不要一味的傻寫呵呵。注意,如果一個外部程序使用的顯示頁面是你的程序所提供的,那你應(yīng)該在DLL

          中處理這個顯示頁,這個DLL應(yīng)該是外部程序所能訪問的。

          Can all of the applications views be exited without loosing user data?

          使用view體系的程序必須有能力處理因外部程序而引起的views的釋放。如果程序不能自動的釋放這些view,那就要考慮其他兩種體系了,要么

          使用view體系as a message passing system,要么讓app UI在傳統(tǒng)體系中管理view。

          Do external applications need complex interactions with the data in your app?

          如果外部程序和你的程序有大量的數(shù)據(jù)交互,那你最好選擇client/server系統(tǒng)。它將減小view的使用量。大量現(xiàn)有的復(fù)雜應(yīng)用,如短信,web

          以及通訊錄都使用這樣的機(jī)制,這是個很好的構(gòu)想,總比要重寫他們要好:)

          Is there only a single complex main view in the app?

          如果是這種情況,那還是使用傳統(tǒng)的體系。

          一些例子>

          這里給出一些假象例子的解決方案。

          App launcher

          這種程序可以單獨(dú)運(yùn)行并且能切換到其他程序,它只有一個view ,并且不接受外部程序的訪問,如果這樣會中斷它。這樣的程序不需要消息的

          傳遞或外部程序需要的views.

          Fast swap window

          一個在運(yùn)行時刻的彈出窗口,這是一個睡眠的彈出對話框其實(shí),它沒有狀態(tài)。

          Email app

          電 子郵件程序可以讀或?qū)戨娮余]件。這個程序有外部使用views,內(nèi)部可切換的views,并能做中斷操作。Notifier信息能告知程序顯示一個新

          的信 息給用戶,所以該程序要有處理此請求的機(jī)制,即使在做其他事情時。編輯框可以做為其他程序的view顯示,使用DLL形式,我們就可以

          做到外部程序的調(diào)用 自如。SymbianOS的messaging程序就是一個client/server機(jī)制可以在其他程序中被調(diào)用。當(dāng)然要實(shí)現(xiàn)內(nèi)嵌在外部程序中

          有許多工 作要做的。當(dāng)你在寫郵件時,很可能又收到新郵件的同志,這個時候新郵件是做為一個嵌套的對話框似的組件顯示在里面的,注意,

          做這個工作時要特別依賴 inter-application interaction model。

          Contacts app

          通訊錄程序允許進(jìn)行通訊錄的顯示、編輯和選擇。選擇后的結(jié)果可以做為其他程序所用。注意它不能因外部view的切換而中斷。

          通過一個外部程序可訪問的dll,通訊錄就可以被外部程序所訪問。程序本身并不需要views,所以最好使用傳統(tǒng)的體系結(jié)構(gòu)編寫,而用dialog

          應(yīng)付所有的編輯窗口。

          web browser

          web瀏覽器可以做為單一的web上網(wǎng)工具,也可以內(nèi)嵌在其他的文檔中。web瀏覽器可以通過外部程序可以訪問的dll來提供一個UI control,但

          并不給外部提供可用的全屏應(yīng)用。它必須能夠應(yīng)付外界的訪問,譬如說應(yīng)付在點(diǎn)擊mail連接后撰寫電子郵件的過程。

          主體程序主要是用傳統(tǒng)的體系結(jié)構(gòu),也可以采用view體系來應(yīng)付訪問頁面的需求。

          Settings

          我們要關(guān)心的是全局設(shè)置和特定應(yīng)用程序的設(shè)置。他們不是一回事情。經(jīng)管他們可能共享一個庫,實(shí)際上他們互不相干。

          設(shè)置程序并不需要為外部的訪問做什么處理提供什么界面,因此他的編寫很簡單,用傳統(tǒng)的或者基于dialog的體系都可以。而局部設(shè)置要注意

          必須小心對待外部可能出現(xiàn)的中斷,并且他有可能做為一個模態(tài)dialog而處理。

          Telephony app

          電話號碼簿程序并不提供外部view,但他必須要處理外部資源的請求。有時候直接用傳統(tǒng)的體系去寫即可,大部分的外部交互可以通過ETEL

          Server.

          [應(yīng)用程序的啟動]

          從CEikApplication派生的類CAknApplication,他有幾個必須重載的函數(shù):

          PreDocContructL()

          OpenIniFileLC(RFs aFs)

          PreDocConstructL,主要是處理已經(jīng)構(gòu)造好的應(yīng)用程序?qū)嶓w是否正確準(zhǔn)備好了。如果已經(jīng)準(zhǔn)備好了,那應(yīng)用程序可以切換到實(shí)體上。注意,這

          個函數(shù)只檢查非內(nèi)嵌程序。

          通常,ini文件并不被series60所支持,如果要處理,那就要強(qiáng)制性的調(diào)用CEikApplication::OpenIniFileC

          [BASE CLASSES]

          CAknDocument

          這個類是做為應(yīng)用程序文檔的基類準(zhǔn)備的。用這個函數(shù)訪問文檔可以不用初始化。這個是訪問Avkon應(yīng)用程序的比較好的途徑。

          CAknAppUi

          所有的Avkon應(yīng)用程序必須從這個類派生。

          這個類支持下面幾個特定應(yīng)用函數(shù):

          KeySound support

          Accessories for CBA and StatusPane

          TextResolver-Avkon-specific error reporting from CAknAppUI::HandleError()

          Avkon view architectrue integration

          Control dumping - Debug feature

          CAknViewAppUi

          所有的視圖結(jié)構(gòu)必須由此派生。

          《S60_Platform_Application_Framework_Handbook_V20_en.pdf》,其中有些翻譯不甚恰當(dāng),不過基本上表達(dá)了原版的意思。

          ------------------------------------------------------------------------------------------------------------------

          1、開發(fā)文檔不是很齊全,雖然每個api都能找到說明,但基本上只是很簡單的介紹。

          實(shí)現(xiàn)某個功能根據(jù)sdk中的文檔,基本上不可能完成。必須尋找相應(yīng)的demo和其他的源代碼來參考。

          2、中文資料很少,基本都是英文,對于國內(nèi)的開發(fā)人員來說,這又是一道坎。

          3、必須注意內(nèi)存的操作。比如PushL 和 Pop等等,一些Symbian中特有的機(jī)制需要熟練掌握。

          4、多線程支持不是很好,多線程中啟動的函數(shù)必須為靜態(tài)的或者全局的,

          就這點(diǎn)就給一些需要多線城支持的solution帶來了很多不便或者根本不能實(shí)現(xiàn)。

          5、掌握了整個Symbian的framework的基本原理之后,整個機(jī)制還是比較明了清晰的。重要的地方是AppUI和View和Container這三個類。

          6、www.newlc.com是一個不錯的技術(shù)網(wǎng)站。強(qiáng)力推薦。

          7、一般www.forum.nokia.com上都會有相關(guān)的例子demo可以下載,只是比較淺顯。

          8、注意rss文件中資源的定義和程序中ui控件的結(jié)合,很容易出錯無法發(fā)現(xiàn)。

          9、mmp文件的修改之后,必須要重新生成項(xiàng)目文件,不然會導(dǎo)致link 2001之類的錯誤。

          -----------------------------------------------------------------------------------------------------------------

          在symbian中,用RThread來操作線程,一個RThread對象代表一個線程的句柄。常用RThead對象來創(chuàng)建或操作其他線程。 RThread的基類是

          RHandleBase類,該類封裝了句柄的行為。RThread,RProcess,RMutex和RSession-Base都繼承自RHandleBase。

          創(chuàng)建一個線程

          /* Name of the new thread */

          _LIT(KThreadName, MyFirstThread);

          /* 下面的函數(shù)是線程將要執(zhí)行的。 參數(shù)parm是要傳遞給線程的數(shù)據(jù),它的類型為TAny*,相當(dāng)標(biāo)準(zhǔn)C中的void* 指針 */

          TInt CThreadExampleAppUi::ThreadEntryPoint(TAny* param){ TInt* para = static_cast(param); *para = 1; return 1;}

          /* 創(chuàng)建一個屬于當(dāng)前進(jìn)程的線程,并打開句柄. */

          TInt res = iThread.Create(KThreadName, ThreadEntryPoint, KDefaultStackSize, NULL, iVariable);

          /* 線程被創(chuàng)建以后進(jìn)入等待狀態(tài),并不能立即執(zhí)行. 如果要線程執(zhí)行,需要調(diào)用它的Resume方法*/

          iThread.Resume();

          停止、刪除一個運(yùn)行的線程??梢哉{(diào)用 Suspend() 來停止一個線程. 但它仍然存在,可以調(diào)用 Resume()來繼續(xù).如果要徹底刪除一個線程,

          可調(diào)用Kill或Terminate。如果進(jìn)程的主線程被刪除,那么程序也會被終止。

          ---------------------------------------------------------------------------------------------------------------------

          在symbian os上運(yùn)行的四種軟件

          應(yīng)用程序

          服務(wù)

          引擎

          內(nèi)核

          symbian系統(tǒng)使用活動對象與客戶-服務(wù)器對事件處理系統(tǒng)進(jìn)行了優(yōu)化

          硬件資源:

          一個cpu,32位arm

          一個rom(只讀存儲器),里面有操作系統(tǒng)與內(nèi)建的中間件和應(yīng)用程序

          ROM盤被映射到z:盤,所有的文件都可以通過Z:盤訪問。

          系統(tǒng)RAM.系統(tǒng)RAM用于兩個方面,一是被當(dāng)前活動的程序和系統(tǒng)核心使用,另一個是當(dāng)成”C”盤的磁盤空間。這兩個部分的大小是變化的,不可

          以保留某個的大小。由于RAM通常只有8MB到16MB,所以內(nèi)存可能用完,因此經(jīng)常出現(xiàn)內(nèi)存越界錯誤或是(寫文件時)磁盤已滿錯誤

          IO設(shè)備,包括帶數(shù)字筆輸入的觸摸屏,鍵盤,記憶卡(被當(dāng)成D盤),rs232串口,紅外口,藍(lán)牙。

          電源,包括電池與外接電源

          symbian os與pc系統(tǒng)的區(qū)別如下:

          資源限制:cpu太慢與太少內(nèi)存

          沒有硬盤,不能使用寫到硬盤的虛擬內(nèi)存,不能保證有足夠的空間保存程序或是數(shù)據(jù)文件

          電源條件嚴(yán)格.

          symbian軟件環(huán)境如下:

          server | server| Application| Application | Application Dll

          | | +————–+————- boundary

          | | | |

          | | | Enghine | Engine

          ——–+———+————+————–+————– Privilege

          boundary

          Kernel

          kernel工作在高級別,管理機(jī)器所有硬件資源。對其它軟件模塊提供訪問這些硬件資源的接口

          其它應(yīng)用程序工作在用戶模式

          上面如果理解普通操作系統(tǒng)如linux的話,那跟普通操作系統(tǒng)沒有區(qū)別

          應(yīng)用程序是一個有用戶界面的程序,在獨(dú)立的進(jìn)程中運(yùn)行

          這與普通操作系統(tǒng)也沒有區(qū)別

          服務(wù)是沒有用戶界面的程序.服務(wù)管理一個或多個資源,并提供api,讓客戶可以訪問它的服務(wù).服務(wù)的客戶可以是一個程序或是其它服務(wù).每個服

          務(wù)也運(yùn)行在獨(dú)立的進(jìn)程空間中。

          在symbian中,使用服務(wù)的形式提供類似其它操作系統(tǒng)上用驅(qū)動程序或是內(nèi)核程序提供的功能。如文件系統(tǒng)的訪問也是客戶/服務(wù)類型的。(微內(nèi)

          核 )

          引擎是一個應(yīng)用程序中操作數(shù)據(jù)而不是與用戶交互的部分.通常你可以把一個程序分成引擎部分和一個GUI部分,多部symbian內(nèi)帶的程序都是這

          樣做的。

          一個應(yīng)用程序引擎可以是一個獨(dú)立的代碼模塊或是一個獨(dú)立的dll,或是幾個dll.

          引擎和應(yīng)用程序間的邊界是模塊或dll的邊界。

          所以在symbian中有四個組件類型與三個邊界類型。dll或是模塊組件對交叉引用來說很方便。它們使系統(tǒng)模塊化與保持封裝。

          權(quán)限邊界對交叉引用比較費(fèi)資源,但是保證系統(tǒng)對用戶太程序隱藏內(nèi)核與設(shè)備

          進(jìn)程邊界是所有的交叉中最昂貴的,它們保證在ram中分開每個程序

          可執(zhí)行文件的格式

          在symbian中有兩種類型的可執(zhí)行文件:

          exe,每個程序都有一個主入口E32main()(看上面的例子),它在獨(dú)立的進(jìn)程中運(yùn)行

          dll,提供多個入口,由系統(tǒng)或是已存在的線程(進(jìn)程)調(diào)用

          有兩種類型的dll,

          共享庫dll,為一個或多個程序提供固定的api,這些dll多數(shù)后綴是.dll,當(dāng)程序啟動時就被讀到內(nèi)存中。

          多態(tài)dll,這些dll實(shí)現(xiàn)抽象的api,如一個打印機(jī)驅(qū)動,socket協(xié)議或是一個應(yīng)用程序。它們的擴(kuò)展名多不是.dll,而是.prn或.prt或.app等。它

          們從與dll相關(guān)的類繼承,并通常只有在程序需要它們時才讀入。

          從技術(shù)上看起來與普通系統(tǒng)上動態(tài)庫的靜態(tài)載入與動態(tài)載入沒有區(qū)別

          但是從功能上看就不一樣了,一種是實(shí)現(xiàn)某種特殊功能的,從某個相關(guān)類繼承的dll,另一個是普通dll

          代碼執(zhí)行

          如果程序代碼在rom上,則直接執(zhí)行,不然需要讀到ram中(與普通操作系統(tǒng)不同,普通操作系統(tǒng)都需要讀到ram中

          不能直接在硬盤上執(zhí)行)

          可執(zhí)行代碼包括三種類型的二進(jìn)制數(shù)據(jù):

          程序代碼

          只讀靜態(tài)數(shù)據(jù)

          可寫靜態(tài)數(shù)據(jù)

          在symbian中對待.exe與.dll是不同的

          由于.exe是不可共享的,如果它在ram中執(zhí)行,那與普通pc系統(tǒng)沒有區(qū)別,如果在ram中執(zhí)行,那它在ram中為可寫靜態(tài)數(shù)據(jù)分配內(nèi)存

          而.dll是共享的,當(dāng)dll首次讀入內(nèi)存中時,它被分配到一個特殊的地址,第二個線程需要這個dll時它只要訪問已經(jīng)存在的這份copy就可以。

          在所有使用它的進(jìn)程中dll的地址都是相同的。symbian系統(tǒng)維護(hù)一個引用計(jì)數(shù),當(dāng)沒有其它線程引用時才將它unload.

          在rom上的dll像rom上的exe一樣直接在rom上執(zhí)行

          為了對dll的大小進(jìn)行優(yōu)化,symbbian進(jìn)行如下操作;

          多數(shù)系統(tǒng)支持通過名字與通過數(shù)字訪問dll提供的入口,由于名字太長,浪費(fèi)空間,所以symbian只提供通過數(shù)字訪問,當(dāng)然在link時可以通過

          名字link.也就是說在.dll中沒有名字訪問辦法,在.lib(引導(dǎo)庫,引導(dǎo)linker正確的link這個dll,這個是在windows中使用的概念,在win下每

          創(chuàng)建一個dll都會創(chuàng)建一個用戶引導(dǎo)鏈接的同名.lib)中有,你的程序link時link的是.lib,link完成后編譯器會自動把引用dll的代碼變成數(shù)字引

          如果dll被讀到ram,那重定位信息(把dll

          load到什么地址)也必須包含在可執(zhí)行文件格式中,這個的影響就是你不能把一個在rom中執(zhí)行的程序放到ram中執(zhí)行的程序.(rom中執(zhí)行的多是

          oem廠家,所以普通開發(fā)者多不用關(guān)心)

          多數(shù)應(yīng)用程序有自己有exe來創(chuàng)建進(jìn)程,其它的程序使用動態(tài)庫(DL)L的形式,在主服務(wù)線程中調(diào)用自己的線程

          多數(shù)gui程序都是多態(tài)(polymorphic)dll,有一個主入口點(diǎn)NewApplication(),這個入口點(diǎn)創(chuàng)建并返回一個繼承自CEikAppication的對象.這樣的

          程序被apprun.exe調(diào)用,app文件名為參數(shù)傳入。

          電源管理

          電源必須高效使用

          在系統(tǒng)已經(jīng)關(guān)機(jī)時,確定程序仍然可以運(yùn)行。如鬧鈐,關(guān)機(jī)后,到時時仍然可以開機(jī)

          電源突然關(guān)掉時,關(guān)鍵數(shù)據(jù)應(yīng)該可以保存

          設(shè)備驅(qū)動

          雖然一般不會了解它,但是理解一下還是很有用的

          設(shè)備驅(qū)動工作在兩個級別

          第一個是中斷服務(wù)程序(ISR),ISR必須很短,并且不能做很多事情,因?yàn)樗赡茉谌魏螘r間出現(xiàn),甚至在內(nèi)核服務(wù)中。通常它只是通知設(shè)備產(chǎn)

          生了中斷并設(shè)置一個標(biāo)志,要求內(nèi)核為第二階段的處理運(yùn)行一個延遲的函數(shù)調(diào)用(delayed function call DFC)

          在方便的時候內(nèi)核調(diào)度DFC.DFC可以使用多數(shù)的核心api,通常只是工作了后向用戶線程通知io操作已經(jīng)完成

          定時器

          ` 內(nèi)核支持真機(jī)上64hz的時鐘與模擬器上10hz的時鐘

          時鐘中斷是最高優(yōu)先級中斷,它可以通過User::After或是RTime::After訪問。時鐘中斷在關(guān)機(jī)時停止,所以如果你請求5s后的定時操作,然后

          跑2s,關(guān)機(jī),再開機(jī)時它也要等3s

          內(nèi)核同時支持日期/時間時鐘,你可以使用User::At或是RTime::At。這個定時器很準(zhǔn)確。在關(guān)機(jī)時,如果時間到了,那它會開機(jī),這對鬧鐘很

          合適。

          內(nèi)存

          symbian使用內(nèi)存管理單元(memory management unit MMU)管理內(nèi)存

          ROM被映射到z:盤,被映射到一個固定的地址。

          物理RAM被MMU分在4k的頁,每個物理頁可以用于:

          用戶進(jìn)程的虛地址空間。

          內(nèi)核服務(wù)的虛地址空間

          ram盤,盤符是c:,ram盤只可通過文件服務(wù)進(jìn)程訪問

          如果dll不在rom中,那它被讀到ram,dll被讀到ram里面后頁面標(biāo)記為只讀只讀的。

          MMU的頁面轉(zhuǎn)換表.如果想理解的話學(xué)習(xí)一下操作系統(tǒng)原理

          自由頁表

          每個進(jìn)程的地址空間可以分成下面三類:

          系統(tǒng)范圍的內(nèi)存,如系統(tǒng)的rom或是讀到ram中的dll

          進(jìn)程范圍的內(nèi)存,如進(jìn)程的.exe映象和它的可寫的靜態(tài)數(shù)據(jù)

          每個線程的內(nèi)存,包括線程的棧與線程默認(rèn)的堆(使用線程默認(rèn)堆的原因只是為了提高內(nèi)存分配與釋放的速度,從開發(fā)角度來看,它與系統(tǒng)里面

          的內(nèi)存沒有區(qū)別)。

          注意沒有交換文件,所以所有的內(nèi)存都是直接使用。同時,也可能會發(fā)生內(nèi)存不夠或是磁盤(c 已滿錯誤

          每個線程的默認(rèn)棧很小,只有12k,所以在symbian開發(fā)中,不要放太多東西到棧中,一般對象都是在堆中分配的。

          線程創(chuàng)建后,它的棧大小就不可再改變。

          線程可以使用new或是User::Alloc從線程默認(rèn)堆中分配內(nèi)存.如果希望從其它堆中分配內(nèi)存,只能使用new

          動態(tài)庫(DLL)

          symbian中dll不支持可寫的靜態(tài)數(shù)據(jù),所以你在里面不可能使用可寫的全局變量或是靜態(tài)變量.

          為什么不支持呢?如果支持,那每個進(jìn)程調(diào)用這個dll時,都需要為這個進(jìn)程分配一個獨(dú)立的堆,而堆最小單位是4k,系統(tǒng)中有很多堆,并且有很

          多程序,所以內(nèi)存消費(fèi)基金是很大的。所以就不支持了

          這樣開發(fā)時不是很不方便?因?yàn)樵赿ll中有時需要保存自己的狀態(tài),進(jìn)行交互

          為了解決這個問題,symbian中引入了線程本地?cái)?shù)據(jù)(thread-local storage

          TLS)概念(查看Dll::Tls

          Dll;;SetTls)。但是調(diào)用TLS性能比較慢.tls的最大大小是1.8k 通常這夠用了。

          文件:

          c: flash ram盤

          z: rom盤

          d: 記憶棒之類的外掛盤

          事件處理

          事件處理模型如下圖:

          keyborad |—————————

          |interrupt

          |

          kernel/driver–+-isr/dfc

          |

          key event

          |

          |

          window serv—–handle key event———–+update window

          | |

          |key event draw |request

          application +—————– handle ———-+

          key event

          在symbian中使用活動對象(active object)來處理事件

          在symbian os中,所有的symbian

          os線程都是事件處理器,每個線程有一個活動調(diào)度對象,加上一個或多個活動對象來處理從設(shè)備或其它程序發(fā)過來的事件。

          每個活動對象都有一個虛擬的成員函數(shù)RunL(),在這個函數(shù)里面處理事件。

          多任務(wù)與搶占式

          symbian os實(shí)現(xiàn)搶占式多線程。

          活動對象用于在單個線程內(nèi)實(shí)現(xiàn)非搶占式多任務(wù)

          --------------------------------------------------------------------------------------------------------------------

          SymbianOS6.X Series60界面的智能手機(jī)基本手機(jī)構(gòu)造..

          SymbianOS6.X Series60界面的智能手機(jī),在插入MMC之后,系統(tǒng)一般存在4個邏輯存儲驅(qū)動器:C(手機(jī)本身的用戶存儲,SX1有4M),D(虛擬

          盤,使用空閑運(yùn)行內(nèi)存虛擬的緩沖盤),E(MMC),Z(手機(jī)的系統(tǒng)ROM只讀)。

          4個盤之中,C E Z盤的文件結(jié)構(gòu)大同小異。而D驅(qū)動器是高速的虛擬驅(qū)動器,主要用來保存剪貼板、wap緩存、和一些臨時交換文件,一般情

          況下,由系統(tǒng)自動調(diào)用,與用戶聯(lián)系不多,不作詳細(xì)介紹。下面我具體的將C E Z三個驅(qū)動器的目錄結(jié)構(gòu)和功能講解一下。 隨著安裝軟件的增

          多,C和E盤的目錄文件會變得紛繁復(fù)雜,我們拋開一些軟件自動生成的次要的文件和目錄抓住系統(tǒng)的結(jié)構(gòu)談一些主要的東西:

          E盤根目錄下:IMAGES SOUNDS VIDEOS目錄,顧名思義就是保存了圖片鈴聲視頻剪輯,這3個目錄等效的出現(xiàn)在C和Z的Nokia目錄下,也就是

          說把相應(yīng)類型的文件拷貝到對應(yīng)的目錄都可以被系統(tǒng)識別(Z盤只讀除外),舉例說明:midi文件或者wav文件拷貝在E:soundsdigital或者

          C:nokiasoundsdigital就可以像Z:NokiaSoundsdigital中固化的音樂文件一樣,出現(xiàn)在情景模式鈴聲的選擇項(xiàng)目中。

          C:Nokia是個無關(guān)緊要的目錄,你完全可以刪掉它而沒有影響,但是這個目錄會經(jīng)常自動生成。原因是,C盤的Nokia目錄中有特別的目錄:

          INSTALL,很顯然這個是為了安裝軟件而設(shè)置的。眾所周知,Symbian系統(tǒng)的軟件是打成SIS壓縮包傳入手機(jī)的某個存儲器中(C、E)然后解包安

          裝的,系統(tǒng)往往在C:NOKIAINSTALL目錄下保存一個安裝副本,以備安裝時遇到不可預(yù)見的錯誤(如突然沒電)或者用戶中斷時能夠恢復(fù)系統(tǒng)

          安全,這也就是很多情況下,在空余很大空間的E盤安裝軟件時,仍然出現(xiàn)“存儲空間已滿”的原因,保持C盤有1M以上的空余空間是個很好的

          習(xí)慣。另外不使用系統(tǒng)的manager轉(zhuǎn)而使用SeleQ進(jìn)行SIS安裝也可以避免產(chǎn)生這個副本。

          下面以分析一下結(jié)構(gòu)最為復(fù)雜的系統(tǒng)核心C:system目錄。System目錄由十幾個目錄和若干文件組成:

          ※APPS目錄:該目錄下的子目錄保存了軟件的主體即:用戶交互可執(zhí)行文件.app、 資源文件.rsc、 圖標(biāo)文件.aif 、無界面可執(zhí)行程

          序.exe以及運(yùn)行所需的其他文件。安裝在E盤的軟件除了在E:SystemApps目錄下保存軟件主體之外,往往會在C:SystemApps同名目錄下創(chuàng)

          建一些配置文件。值得注意的是C:Systemappsphoneoplogo保存了營運(yùn)商的標(biāo)志,如果該目錄保存了97*25的bmp圖像,則在待機(jī)狀態(tài)下將以

          該圖片代替“中國移動”之類的營運(yùn)商標(biāo)志(需要重新啟動手機(jī));

          ※BootData目錄:系統(tǒng)的啟動參數(shù)和日志;

          ※Data目錄:極其繁雜的目錄,保存了各種各樣的數(shù)據(jù),簡單介紹幾個,backgroundimage.mbm壁紙,btstate.dat藍(lán)牙配對信息,

          Calender日歷,clockapp.dat時間參數(shù),Contacts.cdb聯(lián)系人,以及很多軟件的配置文件和wap信息;

          ※favourites目錄:收藏夾;

          ※install目錄:保存了全部的軟件安裝信息,每安裝一個軟件,就在該目錄下保存一個同名sis文件索引,大小在幾百b到幾K不等,假如

          刪除這個sis文件,在程序管理中就不會出現(xiàn)這個軟件的安裝信息,也就無法通過程序管理刪除,但是仍然可以在apps目錄中直接刪除軟件主體

          和配置文件,有必要的話在libs目錄中刪除相應(yīng)運(yùn)行庫,在programs目錄中刪除相應(yīng)輔助運(yùn)行文件,從而徹底卸載軟件;

          ※libs目錄:保存某些軟件運(yùn)行時需要的連接庫文件,一般由軟件安裝;

          ※mail目錄:信息目錄,結(jié)構(gòu)復(fù)雜費(fèi)解,除了一些短信、彩信、EMail設(shè)置文件之外,收件箱、發(fā)件箱、草稿箱、發(fā)送報(bào)告、附件等等分布

          在叢深復(fù)雜的目錄之中。值得一提的是,S60的信息概念比較廣,短信彩信Email甚至紅外藍(lán)牙傳輸?shù)奈募紝儆?ldquo;信息”,因此接受到的紅外

          藍(lán)牙的文件,保存在mail目錄下,而且可以由查看該信息觸發(fā)相應(yīng)的“安裝”、“觀看”、“編輯”等動作;

          ※MIDIets目錄:java配置文件;

          ※midp目錄:java程序主體安裝在這里,如果全部java安裝在E盤,C:system將不會出現(xiàn)這個目錄;

          ※Programs目錄:保存輔助運(yùn)行文件,和一些無界面程序exe、動態(tài)連接庫dll;

          ※Recogs目錄:關(guān)聯(lián)目錄,里面的mdl文件標(biāo)識了文件關(guān)聯(lián)。如QuickWord.mdl標(biāo)識了系統(tǒng)中的doc文件默認(rèn)由quickword打開,另外有些mdl

          文件會驅(qū)動程序運(yùn)行,如eLoader.mdl驅(qū)動了miniGPS、ExtendProfile等ePsint公司開發(fā)的軟件,沒有這個mdl文件,以上兩個軟件不能自動加

          載;

          ※Schedules目錄:顧名思義,保存了日程安排;

          ※SharedData目錄:全部是軟件的配置文件.ini,對用戶作用不大,但是可以通過修改其中的某些數(shù)值和路徑從而使必須安裝在C盤的軟件

          (多半是7650的軟件,它沒有mmc)安裝到mmc;

          ※Temp目錄:臨時文件。

          E:system目錄結(jié)構(gòu)與C:system基本一致,不同的是,少了intsall目錄。

          Z:system比之C:system更加龐大復(fù)雜,它保存了系統(tǒng)的全部自帶程序、資源文件、硬件驅(qū)動、字體字庫、國際化設(shè)置和初始參數(shù)設(shè)置。

          在待機(jī)狀態(tài)下輸入*#7370#,將初始化手機(jī),基本過程就是清空C盤,復(fù)制Z盤某些內(nèi)容至C。某種程度上說Z是系統(tǒng)的初始備份。(新手機(jī)的第

          一幅待機(jī)圖就保存在Z:systemdataapac.mbm)

          關(guān)于路徑問題。由于三個盤的system目錄結(jié)構(gòu)是相似的,所以同名路徑所起到的作用相同,比如E:systemrecogs目錄下的關(guān)聯(lián)文件同樣

          可以起到關(guān)聯(lián)作用,libs等目錄類同(有些情況下將C的內(nèi)容移動到E相應(yīng)路徑中,需要在C:systemSharedData對相應(yīng)的ini文件進(jìn)行修改)

          ,而在E(C):system下建立Fonts目錄則可以加入新的系統(tǒng)字體。只有install目錄僅僅在C:system下才有效。

          了解S60系統(tǒng)的文件結(jié)構(gòu),對于我們使用手機(jī)有著很大幫助,可以最大限度的獲取運(yùn)行空間、了解錯誤產(chǎn)生的原因,有意識的避免可能會帶

          來傷害的操作。本文僅僅對文件結(jié)構(gòu)做了初步的探討和應(yīng)用層面上的解釋,進(jìn)一步的研究可以在西門子和諾基亞論壇的官方文檔得到全面解答

          。希望有所幫助。

          ---------------------------------------------------------------------------------------------------------

          數(shù)據(jù)類型 描述

          TInt8, TUint8 8位 整數(shù)

          TInt16, TUint16 16位 整數(shù)

          TInt32, TUint32 32位 整數(shù)

          TInt, TUint (32位)整數(shù)

          TReal32,TReal64 實(shí)數(shù)

          TText8, TText16 字符, 相當(dāng)于 unsigned char, unsigned short int

          TBool 布爾

          TAny 相當(dāng)于void

          代碼規(guī)范

          Symbian OS 使用很多代碼規(guī)范, 使用他們可以增強(qiáng)Symbain 代碼的可讀性, 有些規(guī)范甚至是需要嚴(yán)格遵守的, 比如類的命名:

          Symbian OS的類一共有6種: 種類 例子 描述

          T classes TDesC, TPoint 這個類可以向基本類型一樣使用,因?yàn)樗麄兺ǔ:苄?,而且不使用heap所以也沒有析構(gòu)函數(shù)

          C classes CConsoleBase, CActive 這個類是Symbian使用最多的類,C代表他們從CBase類繼承而來, 他們必須有析構(gòu)函數(shù)因?yàn)樗麄兊膶ο髣?chuàng)

          建在heap中

          R classes RFile, RTimer R代表資源(Resource),它們只是一個系統(tǒng)資源的句柄,他們本身被創(chuàng)建在Stack上, 但是他們所使用的資源被創(chuàng)

          建在heap上,使用完畢需要Close()

          M classes MEikMenuObserver 這個類是一個空的接口,使用的時候需要從它繼承

          static classes User, Math 這個類只有靜態(tài)函數(shù), 一般都是庫函數(shù)

          Structs SEikControlInfo c - struct

          變量命名:

          種類 例子 描述

          枚舉 EMonday,ETuesday E代表枚舉

          定量 KMaxFileName K代表定量

          成員變量 iDevice, iX i代表成員變量

          參數(shù) aDevice, aX a代表參數(shù)

          局部變量 device, x 局部變量沒有固定的規(guī)范

          -------------------------------------------------------------------------------------------------------

          對Symbian一無所知,當(dāng)然只能從基礎(chǔ)學(xué)起了,也許看一個例子再來看看基礎(chǔ)更簡單些。而我這人比較守舊,就是學(xué)不會這種方法,還只能從基

          礎(chǔ)開始。

          Symbian的字符串和描述符:

          TPtrC、TBufC、HBufC 是從TDesC派生而來的具體的描述符類型。TPtr和TBuf這兩個都是從TDes派生來,而TDes又是從TDesC派生而來。因此

          TDes在TDesC上加了一些常量便利函數(shù)。

          TDesC

          / |

          / TBufCBase TDes

          TPtrC

          | |

          TBufC、HBufC Tptr TBuf

          TDesC和TDes是抽象類。

          _LIT它把一個符號和一個文字值聯(lián)合起來,并且產(chǎn)生TlitC,TlitC的二進(jìn)制形式與TBuf的二進(jìn)制形式是一樣的,因此可以把TLitC作為TDesC類

          來代替。_LIT(he,he); const TDesc hehe = he;

          _L產(chǎn)生一個TPtrC,并且不用制定名稱也可以用。 const TDesC he = _L(he);

          _L與_LIT的區(qū)別就在于,_L需要開辟臨時的棧區(qū)。



          關(guān)鍵詞: Symbian

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉