<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Symbian 入門(mén)

Symbian 入門(mén)

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

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

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

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

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

使用Carbide用向導新建了 OSC++ Project,選擇3rd Ed. GUI Application模版,根據步 驟建立了工程,選擇Emulator Debug,編譯時(shí)出現下如問(wèn)題:

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

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

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

WARNING: EPOCROOT does not specify an existing directory

BLDMAKE ERROR: Directory Symbian9.2S60_3rd_FP1EPOC32 does not exist

上面的是我在配置Symbian開(kāi)發(fā)環(huán)境時(shí)候的一點(diǎn)經(jīng)驗之談,希望能夠對大家有一些幫助,也歡迎大家給與指教,給我這個(gè)菜鳥(niǎo)一些幫助,在此先感謝大家了。

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

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

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

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

需要軟件開(kāi)發(fā)工具包,即Software Development Kit (SDK),它允許你寫(xiě),創(chuàng )建程序為你的手機。

對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用戶(hù)界面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

安裝其個(gè)人版,可試用90天。

安裝SDK

驗證SDK的安裝

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

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

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

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

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

運行—〉輸入cmd—〉輸入epoc—〉出現模擬器則表示安裝成功。

注:參看Getting_Started_final.pdf

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

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

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

機型號包括: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的安裝過(guò)程。

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開(kāi)發(fā)單獨建一個(gè)目錄,例如d:Symbian而不是使用C:program files等這樣的目錄。

第四步:安裝Active Perl和J2RE,安裝到默認目錄即可。

第五步:檢查環(huán)境變量設定。打開(kāi)系統環(huán)境變量tab,然后看看有沒(méi)有EPOCROOT,如果有的話(huà),把它手動(dòng)改成“” 。改完之后應該是這個(gè)樣子

的:

EPOCROOT =

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

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

2.1.2 配置VC

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

60 SDK for Symbian OS v2.1,因為Series 60 SDK for Symbian OS Nokia Edition SDK v1.2在VS.NET2003無(wú)法正確建立工程。

如果要直接在vc6里創(chuà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這個(gè)選項.

填入Project Name 以后,確認。

一路“Next”,一個(gè)最簡(jiǎn)單的Symbian應用程序就建立好了。

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

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

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

bldmake bldfiles

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

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

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

abld makefile vc6

這樣就會(huì )自動(dòng)生成vc6的dsw文件,位置在Symbian6.1Series60Epoc32BUILD SYMBIAN6.1 SERIES60

SERIES60EXHELLOWORLDGROUPHELLOWORLDWINS。然后我們就可以在VC6種打開(kāi)這個(gè)Symbian工程了。

2.2 編譯

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

Symbian6.1Series60Epoc32 ReleasewinsUDEBZSYSTEMapps目錄中。

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

我們在上一節的那個(gè)位置繼續輸入:

abld build wins udeb

這個(gè)命令會(huì )編譯我們的程序,最后在Symbian6.1Series60Epoc32ReleasewinsUDEB目錄下生成我們的helloworld,然后我們可以從開(kāi)始

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

2.2.2 使用VC6編譯Symbian 工程

我們直接打開(kāi)運行abld makefile vc6后生成的dsw文件,VC自動(dòng)裝載轉化過(guò)的工程。按F7便可以直接編譯工程,編譯結果同樣放在

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

2.3 打包

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

2.3.1.檢查程序

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

有無(wú)錯誤。

2.3.2.編譯工程

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

成HELLOWORLD.APP和HELLOWORLD.RSC兩個(gè)文件。

2.3.3.建立.pkg文件

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

; 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是安裝的目標位置。在其中要注意的是,我們在目標位置中用“!”代替了實(shí)際的盤(pán)符。

這樣做得好處是在用戶(hù)安裝的時(shí)候,手機系統會(huì )提示用戶(hù)選擇要安裝的位置,這就給了用戶(hù)更大的靈活度。另外,在Symbian 系統中,安裝的

應用程序默認位置是“!:systemapps ”。

編輯好pkg文件后,保存至相應目錄。

2.3.4.打包程序

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

2.4 手機測試

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

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

我們回到手機的主菜單,就會(huì )發(fā)現新安裝的HelloWorld 應用程序。打開(kāi)運行,結果和在模擬器中看到的基本是一樣的。

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

第一篇:Symbian UI 程序框架

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

1.1 MVC 架構

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

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

件的寫(xiě)法。同時(shí)也會(huì )告訴大家應該到SDK的哪里才能找到這些資源的描述。

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

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

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

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

CEikTextListBox很好的說(shuō)明了這個(gè)構架。比如你可以調用CEikTestListBox中的Model()函數得到一個(gè)Model的指針,然后你就可以訪(fǎng)問(wèn)其中的

CDesArrayFlat數組了。

1.2 Symbian的工程文件

1.2.1工程引導文件bld.inf

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

一種寫(xiě)法是:

PRJ_MMPFILES

project.mmp

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

你所有需要Build的工程都列出來(lái):

PRJ_MMPFILES

project.mmp

project_lib1.mmp

project_lib2.mmp

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

需要的平臺例如:

PRJ_PLATFORMS

WINS ARMI WINSCW

或者直接用

PRJ_PLATFORMS

DEFAULT

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

的。

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

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

PRJ_EXPORTS

.nk_set.inl epoc32include

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

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

比如:

#if defined(WINS)

..... 注意沒(méi)有{}

#else

.....

#endif

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

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

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

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

engine不談,它是程序起作用的靈魂,這個(gè)是因程序而異的,我們來(lái)看應用程序外觀(guān),它可以分為三種體系結構:

一、傳統的symbianOS控制體系結構

二、基于對話(huà)框的體系結構

三、視圖體系結構

看看好象跟MFC搞的似的,也有個(gè)View和Dialog,不過(guò)也是Symbian就是用C++寫(xiě)的,面向對象特性非常好。

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

[傳統SymbianOS應用程序的體系結構]

傳 統意義上,SymbianOS應用程序是在CCoeControl類(lèi)的基礎上派生出我們自己的view controls,這些都存放在應用程序的 control stack中

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

[Dialog體系結構]

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

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

注意,如果不小心規劃,那嵌套的對話(huà)框將耗去大量的堆??臻g。

另外,如果dialog體系結構被用于主要視圖,那建議講其設計為非模態(tài)對話(huà)框。(它不壟斷用戶(hù)的輸入,用戶(hù)打開(kāi)非模態(tài)對話(huà)框后,仍然可以與

其它界面進(jìn)行交互。)如果你要生成一個(gè)主界面對話(huà)框,要求是滿(mǎn)屏,并提供多頁(yè)設計,那應該包括如下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 )建一個(gè)對話(huà)框應該如下:

void CDlgappAppUi::ConstructL()

{

BaseConstructL();

iAppView = new(ELeave) CDlgAppMainView;

iAppView->ExecuteLD(R_DLGAPP_MAIN_DIALOG);

AddToStackL(iAppView);

}

ExecuteLD()在調用后立即返回,并且對話(huà)框必須要加到control stack中——使用AddToStack函數,因為非模態(tài)對話(huà)框不會(huì )自己處理這些。

[View體系結構]

使用view的應用程序每次只能有一個(gè)活動(dòng)的view,當另一個(gè)view要激活時(shí),當前的view就要被釋放。當一個(gè)view被釋放后,所以的菜單,對話(huà)

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

每 個(gè)view都被當作一個(gè)應用UI對待,它必須提供一個(gè)Id()函數以便為系統所標識,它也要重載DoActivateL(),DoDeactivate

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

下面一個(gè)個(gè)的看

DoActivateL()

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

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

消息,那一個(gè)簡(jiǎn)單的檢查 和return即可。

DoDeactive()

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

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

HandleForegroundEventL()

這 個(gè)函數主要是在你的view被激活時(shí)調用(即在DoActivateL()和DoDeactivate()之間被調用)。當你的view在前臺時(shí),它將是

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

被調用。

HandleCommandL()

當view菜單產(chǎn)生一個(gè)命令后本函數將被調用。

HandleStatusPaneSizeChange()

當client的尺寸由于status pane而改變時(shí),本函數被調用了就。

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

1.DoActivateL()

2.HandleForegroundEventL(ETrue)

3.HandleForegroundEventL(EFalse)

4.DoDeactivate()

其中一對HandleForegrounEventL在view被激活的過(guò)程中會(huì )發(fā)生多次調用。

而DoActivateL()在DoDeactivate()被調用前可能會(huì )被多次調用。

View Resources

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

BaseContructL()函數即可。

RESOURCE AVKON_VIEW r_viewapp_view1

{

hotkeys = r_viewapp_hotkeys;

menubar = r_viewapp_view1_menubar;

cba = R_AVKON_SOFTKEYS_OPTIONS_BACK;

}

注意如果沒(méi)有給定的menubar資源,那就會(huì )使用確省的系統menubar

Construction

下面這個(gè)例程是用的AppUI object's ConstructL來(lái)構造出view的,使用了AddView來(lái)登記,最后把第一個(gè)創(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ā)揮作用(注意,一個(gè)view自身是沒(méi)有繪圖能力的),它必須擁有得到一個(gè)從CCoeControl派生的containers,譬如

class CMyViewArchAppView1Container: public CCoeControl, MCoeControlObserver

下面這個(gè)例程將展現編程者自己的CAknView派生類(lèi)

class CMyViewArchAppView1: public CAknVIew

{

.....

private:

CMyViewArchAppView1Container* iVIew;

}

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

當前激活的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í)上,每個(gè)view都有自己的菜單系統,如果你要使用它,應當在A(yíng)VKON_VIEW資源結構中設置,前面已經(jīng)講過(guò)了。

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

//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)行遠程的視圖切換,那就要調用CCoeAppUi::ActivateViewL()函數,并傳遞了一個(gè)包含目標應用程序UID和目標視圖UID的TVwsViewId

Leave recovery

Avkon 視圖體系結構在DoActivateL()退出時(shí)會(huì )有個(gè)自動(dòng)的回復機制。系統會(huì )調用DoDeactivate()在當前view離去時(shí),回復前一個(gè) view,并把

用戶(hù)帶到之前他們所在的地方。如果程序并沒(méi)有前一個(gè)view的存在,那它就會(huì )退出,如果程序前個(gè)view就是當前的view(也就是說(shuō)他們 是重激

活的),則應用程序會(huì )試圖恢復缺省的view.

說(shuō)了這么多,那我們在什么情況下采用合適的體系結構那?下面的內容將會(huì )有所幫助。

使用傳統的SymbianOS體系結構,你要花費大量的時(shí)間研究代碼是怎么工作的,但大部分交互和錯誤處理的引擎代碼都是現成,可以降低你的開(kāi)

發(fā)難度。

Do you have an acyclic graph shaped navigation structure?

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

Are all the application screens dialog like?

如果你的應用程序想使用對話(huà)框,那建議你使用dialog體系結構,注意如果要有一個(gè)選擇列表,那最好寫(xiě)成包含在dialog中的選擇列表。

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

如果是這樣,那最好使用傳統或view體系結構。

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

如果是采用view體系結構寫(xiě)的程序,那它一定支持多個(gè)不同的view,而且是外部程序能訪(fǎng)問(wèn)的。如果你從頭開(kāi)始寫(xiě)一個(gè)應用程序,那建議你使

用view體系結構,

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

中處理這個(gè)顯示頁(yè),這個(gè)DLL應該是外部程序所能訪(fǎng)問(wèn)的。

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

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

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

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

如果外部程序和你的程序有大量的數據交互,那你最好選擇client/server系統。它將減小view的使用量。大量現有的復雜應用,如短信,web

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

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

如果是這種情況,那還是使用傳統的體系。

一些例子>

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

App launcher

這種程序可以單獨運行并且能切換到其他程序,它只有一個(gè)view ,并且不接受外部程序的訪(fǎng)問(wèn),如果這樣會(huì )中斷它。這樣的程序不需要消息的

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

Fast swap window

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

Email app

電 子郵件程序可以讀或寫(xiě)電子郵件。這個(gè)程序有外部使用views,內部可切換的views,并能做中斷操作。Notifier信息能告知程序顯示一個(gè)新

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

做到外部程序的調用 自如。SymbianOS的messaging程序就是一個(gè)client/server機制可以在其他程序中被調用。當然要實(shí)現內嵌在外部程序中

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

做這個(gè)工作時(shí)要特別依賴(lài) inter-application interaction model。

Contacts app

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

通過(guò)一個(gè)外部程序可訪(fǎng)問(wèn)的dll,通訊錄就可以被外部程序所訪(fǎng)問(wèn)。程序本身并不需要views,所以最好使用傳統的體系結構編寫(xiě),而用dialog

應付所有的編輯窗口。

web browser

web瀏覽器可以做為單一的web上網(wǎng)工具,也可以?xún)惹对谄渌奈臋n中。web瀏覽器可以通過(guò)外部程序可以訪(fǎng)問(wèn)的dll來(lái)提供一個(gè)UI control,但

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

主體程序主要是用傳統的體系結構,也可以采用view體系來(lái)應付訪(fǎng)問(wèn)頁(yè)面的需求。

Settings

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

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

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

Telephony app

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

Server.

[應用程序的啟動(dòng)]

從CEikApplication派生的類(lèi)CAknApplication,他有幾個(gè)必須重載的函數:

PreDocContructL()

OpenIniFileLC(RFs aFs)

PreDocConstructL,主要是處理已經(jīng)構造好的應用程序實(shí)體是否正確準備好了。如果已經(jīng)準備好了,那應用程序可以切換到實(shí)體上。注意,這

個(gè)函數只檢查非內嵌程序。

通常,ini文件并不被series60所支持,如果要處理,那就要強制性的調用CEikApplication::OpenIniFileC

[BASE CLASSES]

CAknDocument

這個(gè)類(lèi)是做為應用程序文檔的基類(lèi)準備的。用這個(gè)函數訪(fǎng)問(wèn)文檔可以不用初始化。這個(gè)是訪(fǎng)問(wèn)Avkon應用程序的比較好的途徑。

CAknAppUi

所有的Avkon應用程序必須從這個(gè)類(lèi)派生。

這個(gè)類(lèi)支持下面幾個(gè)特定應用函數:

KeySound support

Accessories for CBA and StatusPane

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

Avkon view architectrue integration

Control dumping - Debug feature

CAknViewAppUi

所有的視圖結構必須由此派生。

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

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

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

實(shí)現某個(gè)功能根據sdk中的文檔,基本上不可能完成。必須尋找相應的demo和其他的源代碼來(lái)參考。

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

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

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

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

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

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

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

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

9、mmp文件的修改之后,必須要重新生成項目文件,不然會(huì )導致link 2001之類(lèi)的錯誤。

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

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

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

創(chuàng )建一個(gè)線(xiàn)程

/* Name of the new thread */

_LIT(KThreadName, MyFirstThread);

/* 下面的函數是線(xiàn)程將要執行的。 參數parm是要傳遞給線(xiàn)程的數據,它的類(lèi)型為T(mén)Any*,相當標準C中的void* 指針 */

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

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

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

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

iThread.Resume();

停止、刪除一個(gè)運行的線(xiàn)程??梢哉{用 Suspend() 來(lái)停止一個(gè)線(xiàn)程. 但它仍然存在,可以調用 Resume()來(lái)繼續.如果要徹底刪除一個(gè)線(xiàn)程,

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

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

在symbian os上運行的四種軟件

應用程序

服務(wù)

引擎

內核

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

硬件資源:

一個(gè)cpu,32位arm

一個(gè)rom(只讀存儲器),里面有操作系統與內建的中間件和應用程序

ROM盤(pán)被映射到z:盤(pán),所有的文件都可以通過(guò)Z:盤(pán)訪(fǎng)問(wèn)。

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

以保留某個(gè)的大小。由于RAM通常只有8MB到16MB,所以?xún)却婵赡苡猛?,因此?jīng)常出現內存越界錯誤或是(寫(xiě)文件時(shí))磁盤(pán)已滿(mǎn)錯誤

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

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

symbian os與pc系統的區別如下:

資源限制:cpu太慢與太少內存

沒(méi)有硬盤(pán),不能使用寫(xiě)到硬盤(pán)的虛擬內存,不能保證有足夠的空間保存程序或是數據文件

電源條件嚴格.

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

server | server| Application| Application | Application Dll

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

| | | |

| | | Enghine | Engine

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

boundary

Kernel

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

其它應用程序工作在用戶(hù)模式

上面如果理解普通操作系統如linux的話(huà),那跟普通操作系統沒(méi)有區別

應用程序是一個(gè)有用戶(hù)界面的程序,在獨立的進(jìn)程中運行

這與普通操作系統也沒(méi)有區別

服務(wù)是沒(méi)有用戶(hù)界面的程序.服務(wù)管理一個(gè)或多個(gè)資源,并提供api,讓客戶(hù)可以訪(fǎng)問(wèn)它的服務(wù).服務(wù)的客戶(hù)可以是一個(gè)程序或是其它服務(wù).每個(gè)服

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

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

核 )

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

樣做的。

一個(gè)應用程序引擎可以是一個(gè)獨立的代碼模塊或是一個(gè)獨立的dll,或是幾個(gè)dll.

引擎和應用程序間的邊界是模塊或dll的邊界。

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

權限邊界對交叉引用比較費資源,但是保證系統對用戶(hù)太程序隱藏內核與設備

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

可執行文件的格式

在symbian中有兩種類(lèi)型的可執行文件:

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

dll,提供多個(gè)入口,由系統或是已存在的線(xiàn)程(進(jìn)程)調用

有兩種類(lèi)型的dll,

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

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

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

從技術(shù)上看起來(lái)與普通系統上動(dòng)態(tài)庫的靜態(tài)載入與動(dòng)態(tài)載入沒(méi)有區別

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

代碼執行

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

不能直接在硬盤(pán)上執行)

可執行代碼包括三種類(lèi)型的二進(jìn)制數據:

程序代碼

只讀靜態(tài)數據

可寫(xiě)靜態(tài)數據

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

由于.exe是不可共享的,如果它在ram中執行,那與普通pc系統沒(méi)有區別,如果在ram中執行,那它在ram中為可寫(xiě)靜態(tài)數據分配內存

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

在所有使用它的進(jìn)程中dll的地址都是相同的。symbian系統維護一個(gè)引用計數,當沒(méi)有其它線(xiàn)程引用時(shí)才將它unload.

在rom上的dll像rom上的exe一樣直接在rom上執行

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

多數系統支持通過(guò)名字與通過(guò)數字訪(fǎng)問(wèn)dll提供的入口,由于名字太長(cháng),浪費空間,所以symbian只提供通過(guò)數字訪(fǎng)問(wèn),當然在link時(shí)可以通過(guò)

名字link.也就是說(shuō)在.dll中沒(méi)有名字訪(fǎng)問(wèn)辦法,在.lib(引導庫,引導linker正確的link這個(gè)dll,這個(gè)是在windows中使用的概念,在win下每

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

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

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

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

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

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

程序被apprun.exe調用,app文件名為參數傳入。

電源管理

電源必須高效使用

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

電源突然關(guān)掉時(shí),關(guān)鍵數據應該可以保存

設備驅動(dòng)

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

設備驅動(dòng)工作在兩個(gè)級別

第一個(gè)是中斷服務(wù)程序(ISR),ISR必須很短,并且不能做很多事情,因為它可能在任何時(shí)間出現,甚至在內核服務(wù)中。通常它只是通知設備產(chǎn)

生了中斷并設置一個(gè)標志,要求內核為第二階段的處理運行一個(gè)延遲的函數調用(delayed function call DFC)

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

定時(shí)器

` 內核支持真機上64hz的時(shí)鐘與模擬器上10hz的時(shí)鐘

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

跑2s,關(guān)機,再開(kāi)機時(shí)它也要等3s

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

合適。

內存

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

ROM被映射到z:盤(pán),被映射到一個(gè)固定的地址。

物理RAM被MMU分在4k的頁(yè),每個(gè)物理頁(yè)可以用于:

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

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

ram盤(pán),盤(pán)符是c:,ram盤(pán)只可通過(guò)文件服務(wù)進(jìn)程訪(fǎng)問(wèn)

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

MMU的頁(yè)面轉換表.如果想理解的話(huà)學(xué)習一下操作系統原理

自由頁(yè)表

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

系統范圍的內存,如系統的rom或是讀到ram中的dll

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

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

的內存沒(méi)有區別)。

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

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

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

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

動(dòng)態(tài)庫(DLL)

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

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

多程序,所以?xún)却嫦M基金是很大的。所以就不支持了

這樣開(kāi)發(fā)時(shí)不是很不方便?因為在dll中有時(shí)需要保存自己的狀態(tài),進(jìn)行交互

為了解決這個(gè)問(wèn)題,symbian中引入了線(xiàn)程本地數據(thread-local storage

TLS)概念(查看Dll::Tls

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

文件:

c: flash ram盤(pán)

z: rom盤(pán)

d: 記憶棒之類(lèi)的外掛盤(pán)

事件處理

事件處理模型如下圖:

keyborad |—————————

|interrupt

|

kernel/driver–+-isr/dfc

|

key event

|

|

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

| |

|key event draw |request

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

key event

在symbian中使用活動(dòng)對象(active object)來(lái)處理事件

在symbian os中,所有的symbian

os線(xiàn)程都是事件處理器,每個(gè)線(xiàn)程有一個(gè)活動(dòng)調度對象,加上一個(gè)或多個(gè)活動(dòng)對象來(lái)處理從設備或其它程序發(fā)過(guò)來(lái)的事件。

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

多任務(wù)與搶占式

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

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

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

SymbianOS6.X Series60界面的智能手機基本手機構造..

SymbianOS6.X Series60界面的智能手機,在插入MMC之后,系統一般存在4個(gè)邏輯存儲驅動(dòng)器:C(手機本身的用戶(hù)存儲,SX1有4M),D(虛擬

盤(pán),使用空閑運行內存虛擬的緩沖盤(pán)),E(MMC),Z(手機的系統ROM只讀)。

4個(gè)盤(pán)之中,C E Z盤(pán)的文件結構大同小異。而D驅動(dòng)器是高速的虛擬驅動(dòng)器,主要用來(lái)保存剪貼板、wap緩存、和一些臨時(shí)交換文件,一般情

況下,由系統自動(dòng)調用,與用戶(hù)聯(lián)系不多,不作詳細介紹。下面我具體的將C E Z三個(gè)驅動(dòng)器的目錄結構和功能講解一下。 隨著(zhù)安裝軟件的增

多,C和E盤(pán)的目錄文件會(huì )變得紛繁復雜,我們拋開(kāi)一些軟件自動(dòng)生成的次要的文件和目錄抓住系統的結構談一些主要的東西:

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

說(shuō)把相應類(lèi)型的文件拷貝到對應的目錄都可以被系統識別(Z盤(pán)只讀除外),舉例說(shuō)明:midi文件或者wav文件拷貝在E:soundsdigital或者

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

C:Nokia是個(gè)無(wú)關(guān)緊要的目錄,你完全可以刪掉它而沒(méi)有影響,但是這個(gè)目錄會(huì )經(jīng)常自動(dòng)生成。原因是,C盤(pán)的Nokia目錄中有特別的目錄:

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

裝的,系統往往在C:NOKIAINSTALL目錄下保存一個(gè)安裝副本,以備安裝時(shí)遇到不可預見(jiàn)的錯誤(如突然沒(méi)電)或者用戶(hù)中斷時(shí)能夠恢復系統

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

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

下面以分析一下結構最為復雜的系統核心C:system目錄。System目錄由十幾個(gè)目錄和若干文件組成:

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

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

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

該圖片代替“中國移動(dòng)”之類(lèi)的營(yíng)運商標志(需要重新啟動(dòng)手機);

※BootData目錄:系統的啟動(dòng)參數和日志;

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

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

※favourites目錄:收藏夾;

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

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

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

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

※mail目錄:信息目錄,結構復雜費解,除了一些短信、彩信、EMail設置文件之外,收件箱、發(fā)件箱、草稿箱、發(fā)送報告、附件等等分布

在叢深復雜的目錄之中。值得一提的是,S60的信息概念比較廣,短信彩信Email甚至紅外藍牙傳輸的文件都屬于“信息”,因此接受到的紅外

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

※MIDIets目錄:java配置文件;

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

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

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

文件會(huì )驅動(dòng)程序運行,如eLoader.mdl驅動(dòng)了miniGPS、ExtendProfile等ePsint公司開(kāi)發(fā)的軟件,沒(méi)有這個(gè)mdl文件,以上兩個(gè)軟件不能自動(dòng)加

載;

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

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

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

※Temp目錄:臨時(shí)文件。

E:system目錄結構與C:system基本一致,不同的是,少了intsall目錄。

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

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

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

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

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

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

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

來(lái)傷害的操作。本文僅僅對文件結構做了初步的探討和應用層面上的解釋?zhuān)M(jìn)一步的研究可以在西門(mén)子和諾基亞論壇的官方文檔得到全面解答

。希望有所幫助。

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

數據類(lèi)型 描述

TInt8, TUint8 8位 整數

TInt16, TUint16 16位 整數

TInt32, TUint32 32位 整數

TInt, TUint (32位)整數

TReal32,TReal64 實(shí)數

TText8, TText16 字符, 相當于 unsigned char, unsigned short int

TBool 布爾

TAny 相當于void

代碼規范

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

Symbian OS的類(lèi)一共有6種: 種類(lèi) 例子 描述

T classes TDesC, TPoint 這個(gè)類(lèi)可以向基本類(lèi)型一樣使用,因為他們通常很小,而且不使用heap所以也沒(méi)有析構函數

C classes CConsoleBase, CActive 這個(gè)類(lèi)是Symbian使用最多的類(lèi),C代表他們從CBase類(lèi)繼承而來(lái), 他們必須有析構函數因為他們的對象創(chuàng )

建在heap中

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

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

M classes MEikMenuObserver 這個(gè)類(lèi)是一個(gè)空的接口,使用的時(shí)候需要從它繼承

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

Structs SEikControlInfo c - struct

變量命名:

種類(lèi) 例子 描述

枚舉 EMonday,ETuesday E代表枚舉

定量 KMaxFileName K代表定量

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

參數 aDevice, aX a代表參數

局部變量 device, x 局部變量沒(méi)有固定的規范

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

對Symbian一無(wú)所知,當然只能從基礎學(xué)起了,也許看一個(gè)例子再來(lái)看看基礎更簡(jiǎn)單些。而我這人比較守舊,就是學(xué)不會(huì )這種方法,還只能從基

礎開(kāi)始。

Symbian的字符串和描述符:

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

TDes在TDesC上加了一些常量便利函數。

TDesC

/ |

/ TBufCBase TDes

TPtrC

| |

TBufC、HBufC Tptr TBuf

TDesC和TDes是抽象類(lèi)。

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

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

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

_L與_LIT的區別就在于,_L需要開(kāi)辟臨時(shí)的棧區。



關(guān)鍵詞: Symbian

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>