<dfn id="is4kg"></dfn>
  • <ul id="is4kg"></ul>
  • <abbr id="is4kg"></abbr>
  • <ul id="is4kg"></ul>
    <bdo id="is4kg"></bdo>

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


      共有7287人關(guān)注過(guò)本帖樹(shù)形打印

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

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


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

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

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

    另一個(gè)就是對(duì)模板進(jìn)行了簡(jiǎn)化 當(dāng)然模板方面在語(yǔ)言開(kāi)發(fā)中不會(huì)有不同 只是修改了它的實(shí)現(xiàn) 這個(gè)可以不用管 只是像c++中的模板一樣使用好了

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

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


    其實(shí)跟c++比起來(lái) symbian對(duì)釋放資源的操作通過(guò)cleanupstack進(jìn)行了支持
    只是需要自己手動(dòng)的把資源放到cleanupstack中
    這樣可以認(rèn)為是c++的手動(dòng)管理資源與java的自動(dòng)資源管理的一個(gè)折中
    第一個(gè)控制臺(tái)下的hello world程序
    很多語(yǔ)言都是從hello world 開(kāi)始 學(xué)習(xí)symbian也不例外 下面從一個(gè)簡(jiǎn)單的hello world程序開(kāi)始 介紹symbian的特點(diǎn)
    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;
    }


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

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

    symbian的開(kāi)發(fā)環(huán)境是使用perl開(kāi)發(fā)的
    所以需要有一個(gè)確定的文件名聲明工程內(nèi)容 這就是bld.inf
    bldmake編譯時(shí)先讀bld.inf 看需要哪個(gè)文件指導(dǎo)編譯過(guò)程
    然后對(duì)mmp文件進(jìn)行轉(zhuǎn)換,生成makefile及其它相關(guān)的編譯規(guī)則文件 同時(shí)在當(dāng)前目錄下生成abld.bat文件
    后面就是使用abld進(jìn)行具體編譯
    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 版本

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


    symbian 模擬器樣子
    在命令行下輸入epoc得到
    如果沒(méi)錢(qián)買(mǎi)智能手機(jī) 如p910 那可以拿這個(gè)來(lái)體會(huì)一下效果



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

    這是一個(gè)典型的symbian程序都會(huì)使用到的功能


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

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

    一般它也會(huì)提供不Leave的相同功能的函數(shù)
    如Defined in TDesC8: 看TDesc8的類說(shuō)明
    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()
    看它們的說(shuō)明
    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反對(duì)(0單帖管理 | 引用 | 回復(fù) 回到頂部

    返回版面帖子列表

    symbian開(kāi)發(fā)介紹








    簽名
    主站蜘蛛池模板: 亚洲国产欧洲综合997久久| 国产精品VA无码一区二区| 国产亚洲精久久久久久无码| ririai66视频在线播放| 无翼乌邪恶工番口番邪恶| 亚洲成综合人影院在院播放| 野花社区在线观看www| 大胸美女放网站| 久久久久久国产精品免费免费男同| 欧美丰满大乳高跟鞋| 免费啪啪小视频| 老司机成人精品视频lsj| 国产私拍福利精品视频| japanese21hdxxxx喷潮| 成人亚洲欧美激情在线电影| 亚洲A∨无码一区二区三区| 欧美最猛性xxxxx69交| 哪个网站可以看毛片| 边吃奶边插下面| 国产精品无圣光一区二区| 一本久久A久久免费精品不卡| 无码一区二区三区中文字幕| 亚洲一二区视频| 欧美成人精品福利网站| 全免费a级毛片免费看| 68日本xxxⅹxxxxx18| 天天在线天天综合网色| 中文字幕网站在线观看| 日本猛妇色xxxxx在线| 亚洲国产av高清无码| 欧美日韩电影在线观看| 免费看污成人午夜网站| 精品国偷自产在线视频| 国产伦精品一区二区三区免.费 | 天啪天天久久天天综合啪| 中文精品久久久久国产网站| 日本夜爽爽一区二区三区| 亚洲人成网男女大片在线播放| 欧美日韩乱国产| 伊人亚洲综合网| 男女下面的一进一出视频|