午夜伦理在线-午夜伦理在线观看-午夜毛片免费看-午夜美女久久久久爽久久-午夜免费


曙海教育集團論壇3G手機技術(shù)專區(qū)Symbian開發(fā) → symbian開發(fā)介紹


  共有8379人關(guān)注過本帖樹形打印

主題:symbian開發(fā)介紹

美女呀,離線,留言給我吧!
wangxinxin
  1樓 個性首頁 | 博客 | 信息 | 搜索 | 郵箱 | 主頁 | UC


加好友 發(fā)短信
等級:青蜂俠 帖子:1393 積分:14038 威望:0 精華:0 注冊:2010-11-12 11:08:23
symbian開發(fā)介紹  發(fā)帖心情 Post By:2010-12-3 14:50:05

symbian操作系統(tǒng)與普通pc的不同是:
  symbian上內(nèi)存不夠多 ,并且cpu速度慢,所以開發(fā)的話需要考慮到節(jié)省內(nèi)存的原則 另外就是分配內(nèi)存失敗時的處理 在這點pc基本上不用考慮 因為有真實內(nèi)存加上虛擬內(nèi)存 夠用的
  symbian操作系統(tǒng)可能運行好幾個月 但是你的程序隨時可能因為異常而退出 退出時釋放程序使用的內(nèi)存及其它相關(guān)資源就相當重要
  
界面開發(fā)最簡單的方法是使用c++ 把相關(guān)的圖形操作使用類來封裝,所以symbian的sdk以c++ 類庫形式提供 如果你還是使用c 那還是趕緊學習c++

由于symbian運行的環(huán)境有限,所以為了提高性能減少資源使用 symbian對標準c++進行了一定的修改,其中最明顯的是去掉了異常處理機制

另一個就是對模板進行了簡化 當然模板方面在語言開發(fā)中不會有不同 只是修改了它的實現(xiàn) 這個可以不用管 只是像c++中的模板一樣使用好了

symbian在語言級不支持異常,但是以庫與宏的形式來提供對導常的支持
throw 對應(yīng)于 User::Leave或是leave相關(guān)函數(shù)
try{}catch(...){}對于于TRAP和TRAPD宏 TRAPD宏與TRAP只是增加了變量定義過程 這兩個沒有區(qū)別

另外 由于資源有限,所以有些程序可能因為不正常的使用資源而死掉 或是因為資源使用完而無法正常執(zhí)行
這時 雖然可以自己增加錯誤處理過程 但是這樣的過程太多了 如內(nèi)存分配 每次分配完 都要檢查是不是成功 沒有成功就釋放資源程序退出 這樣代碼量就很大 而在實時系統(tǒng)中 需要的是代碼少而精
所以 symbian提供了cleanupstack(清除堆棧)機制
當你申請了資源后 把它Push到cleanupstack中 那后面如果某個申請失敗了 可以直接調(diào)用User::Leave退出程序 操作系統(tǒng)會自動幫你釋放你申請的資源 這樣代碼量就減少
如果已經(jīng)成功的使用完資源了 需要自己釋放 那就調(diào)用PopAndDestroy手動釋放它
  
為了保證程序退出時用戶申請的資源全部釋放(主要是內(nèi)存) 所以symbian同時提供了heap marking機制,程序開始時標記當前堆信息 退出時檢查并釋放沒有釋放的堆
  
  總之就是symbian開發(fā)中需要自己處理下面的事情:
   trap harness,cleanup stack,leave,heap marking


其實跟c++比起來 symbian對釋放資源的操作通過cleanupstack進行了支持
只是需要自己手動的把資源放到cleanupstack中
這樣可以認為是c++的手動管理資源與java的自動資源管理的一個折中
第一個控制臺下的hello world程序
很多語言都是從hello world 開始 學習symbian也不例外 下面從一個簡單的hello world程序開始 介紹symbian的特點
CODE
//hellotext.cpp
#include
#include
LOCAL_D CConsoleBase* gConsole;
//  Real main function
void MainL()
{
TBuf    helloWorld(_L("hello"));
helloWorld.Append(_L("World"));
gConsole->Printf(helloWorld);
// 可以把上面三句改成gConsole->Printf(_L"hello world");
}
//  Console harness
void ConsoleMainL()
{
gConsole    = Console::NewL(_L("Hello Text"),
         TSize(KConsFullScreen,KConsFullScreen));
CleanupStack::PushL(gConsole);
MainL();
User::After(5000000);
CleanupStack::PopAndDestroy(gConsole);
}
GLDEF_C TInt    E32Main()
{
__UHEAP_MARK;
CTrapCleanup* cleanupStack  = CTrapCleanup::New();
TRAPD(error,ConsoleMainL());
__ASSERT_ALWAYS(!error,User::Panic(_L("SCMP"),error));
delete cleanupStack;
__UHEAP_MARKEND;
return 0;
}


編譯與運行
symbian的編譯要求比較奇怪
它需要一個bld.inf文件與一個mmp文件
bld.inf聲明build的相關(guān)信息 通常只包括這次build會引用到的mmp文件
.mmp文件保存工程與makefile相關(guān)的信息 用于具體的build過程 它也叫makmakefile project ,也就是創(chuàng)建makefile的文件
bld.inf的文件名是固定的
.mmp文件的文件名則根據(jù)不同的工程而起不同的名字
下面是hellotext工程中這兩個文件的內(nèi)容
CODE
//  BLD.INF
PRJ_MMPFILES
hellotext.mmp
CODE
//  hellotext.mmp
TARGET      HelloText.exe
TARGETTYPE  exe
SOURCEPATH  .
UID         0
SOURCE      hellotext.cpp
USERINCLUDE .
SYSTEMINCLUDE   \epoc32\include
LIBRARY     euser.lib
把上面兩個文件保存到與hellotext.cpp相同的目錄下
編譯過程:
1 打開一個dos窗口
2 cd 到hellotext.cpp所在目錄
3 運行下面命令
bldmake bldfiles
abld build wins udeb
運行完后 你就可以到
epoc/release/wins/udeb目錄下查找hellotext.exe文件
//  BLD.INF
PRJ_MMPFILES
hellotext.mmp
bld.inf只是聲明這個build需要調(diào)用hellotext.mmp模塊

CODE
// hellotext.mmp
TARGET HelloText.exe 生成的應(yīng)用程序名是hellotext.exe
TARGETTYPE exe 生成的應(yīng)用程序類型是exe類型,在symbian上可運行的程序類型有exe與app,另外還支持生成其它類型文件,如dll
SOURCEPATH . 在哪里查找源文件 這里指示是在當前目錄下
UID 0 對exe程序不需要指定,這里寫0
SOURCE hellotext.cpp 生成應(yīng)用程序需要的源文件,這里是hellotext.cpp 可以有多個source 一直照這樣的格式寫就可以
USERINCLUDE . 用戶自定義的頭文件在哪里查找 這里是當前目錄
SYSTEMINCLUDE \epoc32\include 系統(tǒng)頭文件在哪里查找 一般都是這個值
LIBRARY euser.lib 需要鏈接的庫 這是euser.lib

symbian的開發(fā)環(huán)境是使用perl開發(fā)的
所以需要有一個確定的文件名聲明工程內(nèi)容 這就是bld.inf
bldmake編譯時先讀bld.inf 看需要哪個文件指導編譯過程
然后對mmp文件進行轉(zhuǎn)換,生成makefile及其它相關(guān)的編譯規(guī)則文件 同時在當前目錄下生成abld.bat文件
后面就是使用abld進行具體編譯
bld.inf意義就是 build info.編譯信息
mmp文件就是 makmake file
bldmake 就是build make info


bldmake bldfiles 創(chuàng)建build files
abld build wins udeb 創(chuàng)建win simulator unicode debug 版本

另外可能用的其它兩個命令是
bldmake clean 清除生成的build file,這在改變mmp文件后應(yīng)該做
abld reallyclean 清除生成的目標文件(.o) 這在改變源文件內(nèi)容后使用


symbian 模擬器樣子
在命令行下輸入epoc得到
如果沒錢買智能手機 如p910 那可以拿這個來體會一下效果



剛才編譯好的程序的運行
運行epoc/release/wins/udeb/hellotext.exe 看到
沒有抓圖工具 無法上傳
代碼說明
因為手機上沒有dos或是xterm窗口,所以需要聲明一個console類,
打開一個控制臺窗口
LOCAL_D CConsoleBase* gConsole;
//  Real main function
void MainL()
{
控制臺打印
gConsole->Printf(_L"hello world");
}
//  Console harness
void ConsoleMainL()
{
NewL類似標準c中的new 由于symbian中沒有異常,
使用leave trapd代替標準c++中throw catch,
所以如果函數(shù)可能會leave的話 函數(shù)名后會加上一個L   
gConsole    = Console::NewL(_L("Hello Text"),
         TSize(KConsFullScreen,KConsFullScreen));
symbian中為了避免資源瀉漏 使用cleanupstack把需要釋放的內(nèi)容放到cleanupstack中,
當程序非法退出時 symbian操作系統(tǒng)會自動通過cleanupstack來對資源進行釋放
保證資源的釋放放是重要的
因為symbian可用的資源并不多 內(nèi)存現(xiàn)在最多也就16M
而它可能一直運行好幾個月(想看如果你不常關(guān)機的話)
CleanupStack::PushL(gConsole);
調(diào)用自己的函數(shù)
MainL();
停止5秒 讓你看到屏幕顯示
User::After(5000000);
手動釋放剛才申請的資源
CleanupStack::PopAndDestroy(gConsole);
}
symbian中exe程序的入口定義如下GLDEF_C TInt    E32Main
而不是標準C中的的main
可以認為symbian自己定義了main函數(shù),
然后在里面進行自己的初始化
初始化完后再調(diào)用E32main
(在psos下開發(fā)時也是這樣 psos的入口函數(shù)是root 在其它實時系統(tǒng)開發(fā)與普通系統(tǒng)不同
因為可能需要特殊的初始化 )
GLDEF_C TInt    E32Main()
{
__UHEAP_MARK;定義堆保護 保證程序退出時會釋放資源
創(chuàng)建清除堆棧類
CTrapCleanup* cleanupStack  = CTrapCleanup::New();
TRAPD(error,ConsoleMainL());  這個相當于標準c++中的catch(...)
__ASSERT_ALWAYS(!error,User::Panic(_L("SCMP"),error));
delete cleanupStack;
__UHEAP_MARKEND; 堆保護完成 在這里釋放掉所有內(nèi)存
return 0;
}
結(jié)合上面的代碼看symbian提供的機制
Leave , trap,cleanupstack ,heapmarking 都存在了

這是一個典型的symbian程序都會使用到的功能


函數(shù)是不是會Leave 這個在symbian中是以函數(shù)名的形式提供
函數(shù)名后面是L的表示它會Leave 函數(shù)名后面是LC的表示它會Leave,并且已經(jīng)把指針push到cleanupstack中了

leave的情況:
是不是任何情況都會Leave呢
當然不是 只有資源申請失敗或是操作失敗時時會Leave 在系統(tǒng)庫提供的函數(shù)是這樣的

一般它也會提供不Leave的相同功能的函數(shù)
如Defined in TDesC8: 看TDesc8的類說明
Alloc(), AllocL(), AllocLC(), Compare(), CompareC(), CompareF(), Find(), Find(), FindC(), FindC(), FindF(), FindF(), Left(), Length(), Locate(), LocateF(), LocateReverse(), LocateReverseF(), Match(), MatchC(), MatchF(), Mid(), Mid(), Ptr(), Right(), Size(), operator!=(), operator<(), operator<=(), operator==(), operator>(), operator>=(), operator[]()

這里提供了Alloc()和AllocL()
看它們的說明
Alloc()
HBufC8* Alloc() const;
Description
Creates a new 8 bit heap descriptor and initialises it with a copy of this descriptor's data.

Return value
HBufC8* A pointer to the new 8 bit heap descriptor, if creation is successful. NULL, if creation of the descriptor fails.


支持(0中立(0反對(0單帖管理 | 引用 | 回復 回到頂部

返回版面帖子列表

symbian開發(fā)介紹








簽名
主站蜘蛛池模板: 女人洗澡一级特黄毛片 | 国产在线精彩视频 | 亚洲精品一区激情区偷拍 | 外国黄色一级 | 精品福利一区二区三区免费视频 | 国产喷水吹潮视频在线播放 | 免费福利小视频 | 欧美日韩性大片 | 一级视频在线 | 国产成人久久精品激情 | 97香蕉超级碰碰碰久久兔费 | 大片毛片 | 欧美一级毛片高清毛片 | 免费的黄色片视频 | 久久国产免费一区 | 国产a毛片清高视频 | 亚洲免费色 | 1024在线视频精品免费播放 | 中国黄色免费网站 | 久久久精品一级二级三级 | 韩国免费高清一级 | 级毛片| 热综合一本伊人久久精品 | 久久综合九色综合欧洲色 | 欧美一级黄色录像片 | 在线毛片一区二区不卡视频 | 中文字幕乱 | 国产成人精品999在线观看 | 亚洲免费网站 | 黄色毛片免费 | 欧美大片在线观看成人 | 婷婷激情亚洲 | 女人色毛片女人色毛片中国 | 久久这里精品青草免费 | 国产精品嫩草影视在线观看 | 国产一级毛片网站 | 中中文字幕亚州无线码 | 久久毛片免费 | 成人欧美一区二区三区在线观看 | 日韩一区二区三区视频在线观看 | 亚洲国产中文字幕 |