小萝莉穴

寄明月 裸舞 Symbian 初学

深爱激情

你的位置:小萝莉穴 > 深爱激情 > 寄明月 裸舞 Symbian 初学


寄明月 裸舞 Symbian 初学

发布日期:2024-11-09 06:46    点击次数:166

寄明月 裸舞 Symbian 初学

这学期专科推行要作念一个对于Symbian S60的手机软件寄明月 裸舞,是以我采取了CarbideV1.2 OEM和S60 SDK 3rd FP1来作为我方的开发环境,具体的环境搭配如下:

本文援用地址:https://www.eepw.com.cn/article/201609/303390.htm

1.最初安设Carbide,采取OEM版块,至于License的话在网上可以查的出来,大众我方去找,然后会出现release_notes教导安设Perl和SDK等.

2.安设Perl,采取activeperl 5.6.1的版块安设,否则会出现底下的采集上头常见的问题:

使用Carbide用向导新建了Symbian OSC++ Project,采取3rd Ed. GUI Application模版,证据步 骤开发了工程,采取Emulator Debug,编译时出现下如问题:

make[1]: *** No rule to make target `Symbian9.2S60_3rd_FP1_2EPOC32BUILDSymbiancarbideworkspacetestgroupTESTWINSCWTEST.WINSCW'. Stop. test line 0这样的问题,如果采取5.6.1 的话就不会出现上头的问题。(是以软件不是最新版块便是最佳的阿!).

3.安设SDK最佳在他的默许目次,而且这几个都是最佳在全部,我采取的是C盘安设软件和操作系统,给了35G的大小。D盘存取数据。是以这些我都是安设在他的默许目次底下。Carbide和Perl 安设在C 盘program files.SDK 就顺利安设在了C盘上头了。这样的话基本上就差未几了。

4.大开Carbide,要将责任的空间考中在和我方安设carbide的盘符雷同的盘底下。否则的话会出现底下的不实:

WARNING: EPOCROOT does not specify an existing directory

BLDMAKE ERROR: Directory Symbian9.2S60_3rd_FP1EPOC32 does not exist

上头的是我在树立Symbian开发环境时候的极少教学之谈,但愿概况对大众有一些匡助,也迎接大众接纳赐教,给我这个菜鸟一些匡助,在此先感谢大众了。

PS:我是一个菜鸟,亦然刚开头学习Symbian开发干系,是以对Symbian开发不太了解,之是以在这里写博客是我发现里面有许多Symbian开发的妙手,是以但愿大众概况接纳我一些匡助,在此再次感谢了!!~-~

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

开发软件来编译设施,编写设施。即Integrated Development Environment (IDE) ,它包括编著器,编译器和伙同器。

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

需要软件开发用具包,即Software Development Kit (SDK),它允许你写,创建设施为你的手机。

对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。

可以在高下载

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

下载地址为:-c490-4f6e-a931-

ea37ba4f040d/CodeWarrior_Development_Studio_for_Symbian_OS_Personal_Edition_Version_3_1.html

安设其个东说念主版,可试用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、再进到group目次下,该目次下包含bld.inf和helloworldbasic.mmp文献

4、考据编程环境

运行—〉输入cmd—〉输入epoc—〉出现模拟器则暗示安设凯旋。

注:参看Getting_Started_final.pdf

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

Nokia证据手机的屏幕大小和价钱陡立把手机分红了多个系列,当今使用的系列有:Series 40、Series 60、Series 80 和Series 90。60系列

经受Symbian os 6.1,然后又证据手机屏幕的特色对UI作念了一些修改,这个被修改了的Symbian就被称为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的安设历程。

2.1.1 安设SDK

第一步,到Nokia论坛注册,下载最新的SDK。Nokia 网站提供的Series 60 SDK for Symbian OS Nokia Edition SDK最新版块是v1.2,Series

60 SDK for Symbian OS的最新版块是v2.1。下载网址:,6566,034-4,00.html

第二步,到 网站下载最新的Active Perl Script 安设设施。到

下载最新的J2RE。

第三步:安设SDK,推选为Symbian开发单独建一个目次,例如d:Symbian而不是使用C:program files等这样的目次。

第四步:安设Active Perl和J2RE,安设到默许目次即可。

第五步:搜检环境变量设定。大开系统环境变量tab,然后望望有莫得EPOCROOT,如果有的话,把它手动改成“” 。改完之后应该是这个神情

的:

EPOCROOT =

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

本体上,Symbian SDK根蒂无须安设,顺利把epoc32目次拷贝到一个机器上,然后照上述要领设定目次和环境变量就可以了。

2.1.2 树立VC

如果我们使用的是VC 6.0,我们要保证系统至少打了SP3补丁,否则系统会有告戒教导。如果我们使用的是VS.NET2003, 我们就只能安设Series

60 SDK for Symbian OS v2.1,因为Series 60 SDK for Symbian OS Nokia Edition SDK v1.2在VS.NET2003无法正确开发工程。

如果要顺利在vc6里创建新项目,要把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这个选项.

填入Project Name 以后,证明。

一齐“Next”,一个最粗造的Symbian应用设施就开发好了。

如果要将也曾开发好的工程导入到VC6.0中,比如我们将SDK中的例子HelloWorld蜕变成一个VC6的项目,我们最初插足Symbian6.1Series60

Series60ExHelloWorld目次。在这里我们可以看到,在Symbian中,一个Project庸碌是按inc, src, group等目次组织,group目次里庸碌放

的是项目文献,是以编译时要先到这里。用号令教导符模式插足刚才说的阿谁目次下,然后扩充:

bldmake bldfiles

这个号令会在group目次下生成一个abld.bat的批处理文献,况兼会在Symbian 6.1Series60Epoc32BUILD下生成Symbian6.1Series60

Epoc32BUILDSYMBIAN6.1 SERIES60SERIES60EXHELLOWORLDGROUP这个目次,并在最底层目次下生成一堆 .make文献。

然后,我们在团结个目次运行刚才生成的abld.bat:

abld makefile vc6

这样就会自动生成vc6的dsw文献,位置在Symbian6.1Series60Epoc32BUILD SYMBIAN6.1 SERIES60

SERIES60EXHELLOWORLDGROUPHELLOWORLDWINS。然后我们就可以在VC6种大开这个Symbian工程了。

2.2 编译

我们可以顺利使用SDK提供的用具编译Symbian 工程,也可以使用VC6提供的集成环境来编译革新过的Symbian 工程。编译的收尾存放在

Symbian6.1Series60Epoc32 ReleasewinsUDEBZSYSTEMapps目次中。

2.2.1使用SDK提供的用具编译Symbian 工程

我们在上一节的阿谁位置不时输入:

abld build wins udeb

这个号令会编译我们的设施,临了在Symbian6.1Series60Epoc32ReleasewinsUDEB目次下生成我们的helloworld,然后我们可以从开头

菜单里运行模拟器的debug版,在模拟其中就可以运行helloworld了。

2.2.2 使用VC6编译Symbian 工程

我们顺利大开运行abld makefile vc6青年景的dsw文献,VC自动装载革新过的工程。按F7便可以顺利编译工程,编译收尾同样放在

Symbian6.1Series60Epoc32Release winsUDEB目次中。然后我们大开模拟器debug 版,就可以看到我们编译好的工程了。

2.3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安设的.SIS文献:

2.3.1.搜检设施

最初,在号令行格式下,插足HelloWorld工程mmp文献所在目次,输入bldmake bldfiles和abld build wins udeb,然后大开模拟器,检测设施

有无不实。

2.3.2.编译工程

在设施无不实后,在号令行输入abld build armi urel 。扩充这个号令之后会在目次d:symbian6.1series60epoc32releasearmiurel生

成HELLOWORLD.APP和HELLOWORLD.RSC两个文献。

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是安设的指标位置。在其中要细心的是,我们在指标位置顶用“!”代替了本体的盘符。

这样作念得刚正是在用户安设的时候,手机系统会教导用户采取要安设的位置,这就给了用户更大的生动度。另外,在Symbian 系统中,安设的

应用设施默许位置是“!:systemapps ”。

编著好pkg文献后,保存至相应目次。

2.3.4.打包设施

在号令行中,转至pkg文献所在目次,运行号令makesis HelloWorld.pkg。之后我们就在团结目次下得到了打包好的.sis文献。

2.4 手机测试

将打包好地.sis文献上传至手机中,然后在手机的应用设施管理器中就可以看到我们打包好的文献。采取“安设”号令,系统会教导用户要安

装的位置,采取安设位置后,我们制作的应用设施就安设得手机中了。

我们回得手机的主菜单,就会发现新安设的HelloWorld 应用设施。大开运行,收尾和在模拟器中看到的基本是一样的。

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

第一篇:Symbian UI 设施框架

Symbian UI 设施的框架基本上是救援的。大众只消学习一种粗造的框架就可以进行大部分的Symbian开发了。我这里先先容一个宗旨。

1.1 MVC 架构

Symbian 基本上使用MVC架构来搭建控件。Symbian UI设施设想主要矜重的亦然怎样使用控件。而No kia莫得作念好的一个方面便是联系UI

Control的匡助太少了。SDK提供的匡助里面根蒂就莫得资源文献的写法。这一张里面我会先容一些控件例如Dialog,Text Listbox等等资源文

件的写法。同期也会告诉大众应该到SDK的那儿才能找到这些资源的描摹。

关联词最初,我先先容一下MVC架构。MVC并不是个新东西。他是Model - View - Control的缩写。在往常smalltalk中就也曾开头用了。其主要的

想法是在构造类的时候把线路,适度以及模子分开。Symbian对其作了小的更正。在Nokia提供的Series 90控件组(便是CKON,以后我再提CKON

的时候大众要知说念指得是S90的控件)中Model主要用来存储数据,以及封装对数据的操作。也便是对于对象实体的操作。View天然是负责线路

。Control被轮廓成一个或多个纯虚类(Mixin)其它对象通过重写虚函数来得到对象里面的景象以及适度对象。Series 90的Text Listbox类

CEikTextListBox很好的说明了这个构架。比如你可以调用CEikTestListBox中的Model()函数得到一个Model的指针,然后你就可以走访其中的

CDesArrayFlat数组了。

1.2 Symbian的工程文献

1.2.1工程相通文献bld.inf

这个东东其实便是一个剧本,它告诉Build环境在作念Build之前需要准备或知说念一些什么东西。最遍及的

一种写法是:

PRJ_MMPFILES

project.mmp

这是告诉Build环境:你飞速要处理的工程文献名字叫project.mmp。大众如果作念比拟复杂的设施可能需要同期Build所有的库,那么就在这里把

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

PRJ_MMPFILES

project.mmp

project_lib1.mmp

project_lib2.mmp

另外的一个常用的标记是PRJ_PLATFORMS这个东东告诉编译环境,以下的这些平台(Targets)是需要编译的。你可以在这个标记的下一排列出

需要的平台例如:

PRJ_PLATFORMS

WINS ARMI WINSCW

或者顺利用

PRJ_PLATFORMS

DEFAULT

细心,如果你不作PRJ_PLATFORMS这个标记自后果等于PRJ_PLATFORMS DEFAULT,是以这个不是必须

的。

第三个常用标记是PRJ_EXPORTS这个东西告诉编译环境在编译之前需要把哪些文献先拷贝到指定位置。我举个粗造的例子大众就知说念什么兴味了

。比如你的工程中需要include一个第三方的*.inl的文献,那么如果编译之 前这个文献不存在就会编译不外。你可以这样写:

PRJ_EXPORTS

.nk_set.inl epoc32include

那么在你编译的时候,一个Perl剧本会先把你工程目次下的nk_set.inl文献拷贝到epoc32include目次下,然后再 编译工程。

大多数工程只消用这三个标记就可以了。还有极幼年手段这个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中的应用设施庸碌分为两个部分,engine和UI,如斯的分手增多了可珍重性和生动性,engine就好象是设施的中枢,它主要处理运算和

数据,而UI(应该是User Interface)主要处理数据的线路和所有行动(操作行动应该是)。

engine不谈,它是设施起作用的灵魂,这个是因设施而异的,我们来看应用设施外不雅,它可以分为三种体绑缚构:

一、传统的symbianOS适度体绑缚构

二、基于对话框的体绑缚构

三、视图体绑缚构

望望好象跟MFC搞的似的,也有个View和Dialog,不外亦然Symbian便是用C++写的,面向对象秉性相称好。

哄骗什么样的界面取决于设施和界面布局的需要,就未几说了。只是岂论你使用哪种,都是从一个基类袭取而来的,就好象是CView一样。

[传统SymbianOS应用设施的体绑缚构]

传 统道理上,SymbianOS应用设施是在CCoeControl类的基础上派生出我们我方的view controls,这些都存放在应用设施的 control stack中

,也便是我们应用设施的视图。这些controls会证据应用设施的需要来创建开释或线路荫藏,以产生相应的操作。

[Dialog体绑缚构]

如果主体应用是对话框,那我们更应该使用这样的体绑缚构,使用dialogs的刚正是我们光可以靠改变resource文献来修改内容和布局,而不需

要从新编译那c++代码。

细心,如果不小神思划,那嵌套的对话框将耗去多量的堆栈空间。

另外,如果dialog体绑缚构被用于主要视图,那提倡讲其设想为非模态对话框。(它不驾御用户的输入,用户大开非模态对话框后,仍然可以与

其它界面进行交互。)如果你要生成一个主界濒临话框,要求是满屏,并提供多页设想,那应该包括如下features:

RESOURCE DIALOG r_dlgapp_main_dialog

{

flags = EEikDialogFlagNoDrag | EEikDialogFlagNoTitleBar |

EEikDialogFlagFillAppClientRect |

EEikDialogFlagCbaButtons | EEikDialogFlagModelss;

buttons = r_dlgapp_softkeys_options_home;

pages = r_dlgapp_main_pages;

}

如果要创建一个对话框应该如下:

void CDlgappAppUi::ConstructL()

{

BaseConstructL();

iAppView = new(ELeave) CDlgAppMainView;

iAppView->ExecuteLD(R_DLGAPP_MAIN_DIALOG);

AddToStackL(iAppView);

}

ExecuteLD()在调用后立即复返,况兼对话框必须要加到control stack中——使用AddToStack函数,因为非模态对话框不会我方处理这些。

[View体绑缚构]

使用view的应用设施每次只能有一个步履的view,当另一个view要激活时,面前的view就要被开释。当一个view被开释后,是以的菜单,对话

框以及包含的应用都将被关闭。

每 个view都被行动一个应用UI对待,它必须提供一个Id()函数以便为系统所象征,它也要重载DoActivateL(),DoDeactivate

(),HandleForegroundEventL(),HandlCommandL()和HandleStatusPaneSizeChange() 函数以处理多样事件。

底下一个个的看

DoActivateL()

当客户端要求你的view激活时,它就要被调用。 client可能发送音书参数给你的view,如果你的view也曾是激活了,那唯有当client明确要求

再次激活时才被调用,是以你的 DoActivateL()收场得搪塞这种情况,ie也曾激活了view。如果你不筹算线路view或者你的view不想处理任何

音书,那一个粗造的搜检 和return即可。

DoDeactive()

这个函数当你的view被刊出时调用,view被刊出时庸碌有两种情况:一是你的应用设施要退出了,二是雷同设施里另一个view要被激活。这个

函数很热切,我们可不可健忘了:)

HandleForegroundEventL()

这 个函数主如若在你的view被激活时调用(即在DoActivateL()和DoDeactivate()之间被调用)。当你的view在前台时,它将是

HanleForegroundEvent(ETrue),当你的view移出前台时,它将为HandleForegroundEvent (EFalse),唯有面前台景象照实改变时这个函数才会

被调用。

HandleCommandL()

当view菜单产生一个号令后本函数将被调用。

HandleStatusPaneSizeChange()

当client的尺寸由于status pane而改变时,本函数被调用了就。

底下是一个view在接受事件的典型调用轨则

1.DoActivateL()

2.HandleForegroundEventL(ETrue)

3.HandleForegroundEventL(EFalse)

4.DoDeactivate()

其中一双HandleForegrounEventL在view被激活的历程中会发生屡次调用。

而DoActivateL()在DoDeactivate()被调用前可能会被屡次调用。

View Resources

如果你要使用view来线路pages,那唯独的门道是创建出我方的AVKON_VIEW资源,里面有我方的CBA和菜单,把这个资源的id传递给view的

BaseContructL()函数即可。

RESOURCE AVKON_VIEW r_viewapp_view1

{

hotkeys = r_viewapp_hotkeys;

menubar = r_viewapp_view1_menubar;

cba = R_AVKON_SOFTKEYS_OPTIONS_BACK;

}

细心如果莫得给定的menubar资源,那就会使用确省的系统menubar

Construction

底下这个例程是用的AppUI object's ConstructL来构造出view的,使用了AddView来登记,临了把第一个创建的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施展作用(细心,一个view自身是莫得绘画技艺的),它必须领有得到一个从CCoeControl派生的containers,比喻

class CMyViewArchAppView1Container: public CCoeControl, MCoeControlObserver

底下这个例程将展现编程者我方的CAknView派生类

class CMyViewArchAppView1: public CAknVIew

{

.....

private:

CMyViewArchAppView1Container* iVIew;

}

大众可以看出App里产生了View,View类中有我们必须的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));

事实上,每个view都有我方的菜单系统,如果你要使用它,应当在AVKON_VIEW资源结构中诞生,前边也曾讲过了。

而且岂论怎样说,如果要使用系统菜单,它的内容在切换之前是一定要更新一次的。

//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

如果要进行资料的视图切换,那就要调用CCoeAppUi::ActivateViewL()函数,并传递了一个包含指标应用设施UID和指标视图UID的TVwsViewId

Leave recovery

Avkon 视图体绑缚构在DoActivateL()退出时会有个自动的回答机制。系统会调用DoDeactivate()在面前view离去时,回答前一个 view,并把

用户带到之前他们所在的所在。如果设施并莫得前一个view的存在,那它就会退出,如果设施前个view便是面前的view(也便是说他们 是重激

活的),则应用设施会试图还原缺省的view.

说了这样多,那我们在什么情况下经受稳妥的体绑缚构那?底下的内容将会有所匡助。

使用传统的SymbianOS体绑缚构,你要破耗多量的时曲折洽代码是怎样责任的,但大部分交互和不实处理的引擎代码都是现成,可以裁减你的开

发难度。

Do you have an acyclic graph shaped navigation structure?

如果你视图设施中的navigation概况as an acyclic gragh,那最佳使用dialog体绑缚构。

Are all the application screens dialog like?

如果你的应用设施想使用对话框,那提倡你使用dialog体绑缚构,细心如果要有一个采取列表,那最佳写成包含在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体绑缚构写的设施,那它一定复旧多个不同的view,而且是外部设施能走访的。如果你重新开头写一个应用设施,那提倡你使

用view体绑缚构,

否则给我望望有莫得现成的代码可利用,不要一味的傻写呵呵。细心,如果一个外部设施使用的线路页面是你的设施所提供的,那你应该在DLL

中处理这个线路页,这个DLL应该是外部设施所能走访的。

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

使用view体系的设施必须有技艺处理因外部设施而引起的views的开释。如果设施不可自动的开释这些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

以及通信录都使用这样的机制,这是个很好的构想,总比要重写他们要好:)

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

如果是这种情况,那如故使用传统的体系。

一些例子>

这里给出一些假象例子的处分决议。

App launcher

这种设施可以单独运行况兼能切换到其他设施,它唯有一个view ,况兼不接受外部设施的走访,如果这样会中断它。这样的设施不需要音书的

传递或外部设施需要的views.

Fast swap window

一个在运行时刻的弹出窗口,这是一个寝息的弹出对话框其实,它莫得景象。

Email app

电 子邮件设施可以读或写电子邮件。这个设施有外部使用views,里面可切换的views,并能作念中断操作。Notifier信息能奉告设施线路一个新

的信 息给用户,是以该设施要有处理此苦求的机制,即使在作念其他事情时。编著框可以作念为其他设施的view线路,使用DLL体式,我们就可以

作念到外部设施的调用 沉静。SymbianOS的messaging设施便是一个client/server机制可以在其他设施中被调用。天然要收场内嵌在外部设施中

有许多工 作要作念的。当你在写邮件时,很可能又收到新邮件的同道,这个时候新邮件是作念为一个嵌套的对话框似的组件线路在里面的,细心,

作念这个责任时要尽头依赖 inter-application interaction model。

Contacts app

通信录设施允许进行通信录的线路、编著和采取。采取后的收尾可以作念为其他设施所用。细心它不可因外部view的切换而中断。

通过一个外部设施可走访的dll,通信录就可以被外部设施所走访。设施自身并不需要views,是以最佳使用传统的体绑缚构编写,而用dialog

搪塞所有的编著窗口。

web browser

web浏览器可以作念为单一的web上网用具,也可以内嵌在其他的文档中。web浏览器可以通过外部设施可以走访的dll来提供一个UI control,但

并不给外部提供可用的全屏应用。它必须概况搪塞外界的走访,比喻说搪塞在点击mail伙同后撰写电子邮件的历程。

主体设檀越如若用传统的体绑缚构,也可以经受view体系来搪塞走访页面的需求。

Settings

我们要温雅的是全局诞生和特定应用设施的诞生。他们不是一趟事情。照看他们可能分享一个库,本体上他们互不联系。

诞生设施并不需要为外部的走访作念什么处理提供什么界面,因此他的编写很粗造,用传统的或者基于dialog的体系都可以。而局部诞生要细心

必须留心对待外部可能出现的中断,况兼他有可能作念为一个模态dialog而处理。

Telephony app

电话号码簿设施并不提供外部view,但他必须要处理外部资源的苦求。偶而候顺利用传统的体系去写即可,大部分的外部交互可以通过ETEL

Server.

[应用设施的启动]

从CEikApplication派生的类CAknApplication,他有几个必须重载的函数:

PreDocContructL()

OpenIniFileLC(RFs aFs)

PreDocConstructL,主如若处理也曾构造好的应用设施实体是否正确准备好了。如果也曾准备好了,那应用设施可以切换到实体上。细心,这

个函数只搜检非内嵌设施。

庸碌,ini文献并不被series60所复旧,如果要处理,那就要强制性的调用CEikApplication::OpenIniFileC

[BASE CLASSES]

CAknDocument

这个类是作念为应用程小序档的基类准备的。用这个函数走访文档可以无须运革新。这个是走访Avkon应用设施的比拟好的门道。

CAknAppUi

所有的Avkon应用设施必须从这个类派生。

这个类复旧底下几个特定应用函数:

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》,其中有些翻译不甚妥贴,不外基本上抒发了原版的兴味。

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

1、开发文档不是很皆全,天然每个api都能找到说明,但基本上只是很粗造的先容。

收场某个功能证据sdk中的文档,基本上不可能完成。必须寻找相应的demo和其他的源代码来参考。

2、华文良友很少,基本都是英文,对于国内的开发东说念主员来说,这又是一说念坎。

3、必须细心内存的操作。比如PushL 和 Pop等等,一些Symbian中独到的机制需要老到掌持。

4、多线程复旧不是很好,多线程中启动的函数必须为静态的或者全局的,

就这点就给一些需要多线城复旧的solution带来了许多未便或者根蒂不可收场。

5、掌持了通盘Symbian的framework的基本道理之后,通盘机制如故比拟明了了了的。热切的所在是AppUI和View和Container这三个类。

6、www.newlc.com是一个可以的技艺网站。强力推选。

7、一般www.forum.nokia.com上都会有干系的例子demo可以下载,只是比拟简便。

8、细心rss文献中资源的界说和设施中ui控件的结合,很容易出错无法发现。

9、mmp文献的修改之后,必须要从重生成项目文献,否则会导致link 2001之类的不实。

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

在symbian中,用RThread来操作线程,一个RThread对象代表一个线程的句柄。常用RThead对象来创建或操作其他线程。 RThread的基类是

RHandleBase类,该类封装了句柄的行动。RThread,RProcess,RMutex和RSession-Base都袭取自RHandleBase。

创建一个线程

/* Name of the new thread */

_LIT(KThreadName, MyFirstThread);

/* 底下的函数是线程将要扩充的。 参数parm是要传递给线程的数据,它的类型为TAny*,尽头表率C中的void* 指针 */

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

/* 创建一个属于面前景度的线程,并大开句柄. */

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

/* 线程被创建以后插足恭候景象,并不可立即扩充. 如果要线程扩充,需要调用它的Resume要领*/

iThread.Resume();

住手、删除一个运行的线程。可以调用 Suspend() 来住手一个线程. 但它仍然存在,可以调用 Resume()来不时.如果要透顶删除一个线程,

可调用Kill或Terminate。如果程度的干线程被删除,那么设施也会被远离。

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

在symbian os上运行的四种软件

应用设施

劳动

引擎

内核

symbian系统使用步履对象与客户-劳动器对事件处理系统进行了优化

硬件资源:

一个cpu,32位arm

一个rom(只读存储器),里面有操作系统与内建的中间件和应用设施

ROM盘被映射到z:盘,所有的文献都可以通过Z:盘走访。

系统RAM.系统RAM用于两个方面,一是被面前步履的设施和系统中枢使用,另一个是当成”C”盘的磁盘空间。这两个部分的大小是变化的,不可

以保留某个的大小。由于RAM庸碌唯有8MB到16MB,是以内存可能用完,因此往往出现内存越界不实或是(写文献时)磁盘已满不实

IO设备,包括带数字笔输入的触摸屏,键盘,记念卡(被当成D盘),rs232串口,红外口,蓝牙。

电源,包括电板与外接电源

symbian os与pc系统的区别如下:

资源适度:cpu太慢与太少内存

莫得硬盘,不可使用写到硬盘的臆造内存,不可保证有裕如的空间保存设施或是数据文献

电源条款严格.

symbian软件环境如下:

server | server| Application| Application | Application Dll

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

| | | |

| | | Enghine | Engine

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

boundary

Kernel

kernel责任在高档别,管理机器所有硬件资源。对其它软件模块提供走访这些硬件资源的接口

其它应用设施责任在用户模式

上头如果意会遍及操作系统如linux的话,那跟遍及操作系统莫得区别

应用设施是一个有用户界面的设施,在孤独的程度中运行

这与遍及操作系统也莫得区别

劳动是莫得用户界面的设施.劳动管理一个或多个资源,并提供api,让客户可以走访它的劳动.劳动的客户可以是一个设施或是其它劳动.每个服

务也运行在孤独的程度空间中。

在symbian中,使用劳动的体式提供肖似其它操作系统上用驱动设施或是内核设施提供的功能。如文献系统的走访亦然客户/劳动类型的。(微内

核 )

引擎是一个应用设施中操作数据而不是与用户交互的部分.庸碌你可以把一个设施分红引擎部分和一个GUI部分,多部symbian内带的设施都是这

样作念的。

一个应用设施引擎可以是一个孤独的代码模块或是一个孤独的dll,或是几个dll.

引擎和应用设施间的范畴是模块或dll的范畴。

是以在symbian中有四个组件类型与三个范畴类型。dll或是模块组件对交叉援用来说很便捷。它们使系统模块化与保持封装。

权限范畴对交叉援用比拟费资源,关联词保证系统对用户太设施荫藏内核与设备

程度范畴是所有的交叉中最昂然的,它们保证在ram均分开每个设施

可扩充文献的格式

在symbian中有两种类型的可扩充文献:

exe,每个设施都有一个主进口E32main()(看上头的例子),它在孤独的程度中运行

dll,提供多个进口,由系统或是已存在的线程(程度)调用

有两种类型的dll,

分享库dll,为一个或多个设施提供固定的api,这些dll多数后缀是.dll,当设施启动时就被读到内存中。

多态dll,这些dll收场轮廓的api,如一个打印机驱动,socket合同或是一个应用设施。它们的扩张名多不是.dll,而是.prn或.prt或.app等。它

们从与dll干系的类袭取,并庸碌唯有在设施需要它们时才读入。

从技艺上看起来与遍及系统上动态库的静态载入与动态载入莫得区别

关联词从功能上看就不一样了,一种是收场某种稀奇功能的,从某个干系类袭取的dll,另一个是遍及dll

代码扩充

如果设施代码在rom上,则顺利扩充,否则需要读到ram中(与遍及操作系统不同,遍及操作系统都需要读到ram中

不可顺利在硬盘上扩充)

可扩充代码包括三种类型的二进制数据:

设施代码

只读静态数据

可写静态数据

在symbian中对待.exe与.dll是不同的

由于.exe是不可分享的,如果它在ram中扩充,那与遍及pc系统莫得区别,如果在ram中扩充,那它在ram中为可写静态数据分拨内存

而.dll是分享的,当dll初度读入内存中时,它被分拨到一个稀奇的地址,第二个线程需要这个dll时它只消走访也曾存在的这份copy就可以。

在所有使用它的程度中dll的地址都是雷同的。symbian系统珍重一个援用计数,当莫得其它线程援用时才将它unload.

在rom上的dll像rom上的exe一样顺利在rom上扩充

为了对dll的大小进行优化,symbbian进行如下操作;

多数系统复旧通过名字与通过数字走访dll提供的进口,由于名字太长,奢华空间,是以symbian只提供通过数字走访,天然在link时可以通过

名字link.也便是说在.dll中没著明字走访宗旨,在.lib(相通库,相通linker正确的link这个dll,这个是在windows中使用的宗旨,在win下每

创建一个dll都会创建一个用户相通衔接的同名.lib)中有,你的设施link时link的是.lib,link完成后编译器会自动把援用dll的代码酿成数字引

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

load到什么地址)也必须包含在可扩充文献格式中,这个的影响便是你不可把一个在rom中扩充的设施放到ram中扩充的设施.(rom中扩充的多是

oem厂家,是以遍及开发者多无须温雅)

多数应用设施有我方有exe来创建程度,其它的设施使用动态库(DL)L的体式,在主劳动线程中调用我方的线程

多数gui设施都是多态(polymorphic)dll,有一个主进口点NewApplication(),这个进口点创建并复返一个袭取自CEikAppication的对象.这样的

设施被apprun.exe调用,app文献名为参数传入。

电源管理

电源必须高效使用

在系统也曾关机时,细目设施仍然可以运行。如闹钤,关机后,到频频仍然可以开机

电源片刻关掉时,重要数据应该可以保存

设备驱动

天然一般不会了解它,关联词意会一下如故很有用的

设备驱动责任在两个级别

第一个是中断劳动设施(ISR),ISR必须很短,况兼不可作念许多事情,因为它可能在职何时间出现,致使在内核劳动中。庸碌它只是申诉设备产

生了中断并诞生一个标志,要求内核为第二阶段的处理运行一个蔓延的函数调用(delayed function call DFC)

在便捷的时候内核调遣DFC.DFC可以使用多数的中枢api,庸碌只是责任了后向用户线程申诉io操作也曾完成

定时器

` 内核复旧真机上64hz的时钟与模拟器上10hz的时钟

时钟中断是最高优先级中断,它可以通过User::After或是RTime::After走访。时钟中断在关机时住手,是以如果你苦求5s后的定时操作,然后

跑2s,关机,再开机时它也要等3s

内核同期复旧日期/时间时钟,你可以使用User::At或是RTime::At。这个定时器很准确。在关机时,如果时间到了,那它会开机,这对闹钟很

稳妥。

内存

symbian使用内存管理单元(memory management unit MMU)管理内存

ROM被映射到z:盘,被映射到一个固定的地址。

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

用户程度的虚地址空间。

内核劳动的虚地址空间

ram盘,盘符是c:,ram盘只能通过文献劳动程度走访

如果dll不在rom中,那它被读到ram,dll被读到ram里面后页面标记为只读只读的。

MMU的页面蜕变表.如果想意会的话学习一下操作系统道理

摆脱页表

每个程度的地址空间可以分红底下三类:

系统范畴的内存,如系统的rom或是读到ram中的dll

程度范畴的内存,如程度的.exe映象和它的可写的静态数据

每个线程的内存,包括线程的栈与线程默许的堆(使用线程默许堆的原因只是为了擢升内存分拨与开释的速率,从开发角度来看,它与系统里面

的内存莫得区别)。

细心莫得交换文献,是以所有的内存都是顺利使用。同期,也可能会发生内存不够或是磁盘(c 已满不实

每个线程的默许栈很小,唯有12k,是以在symbian开发中,不要放太多东西到栈中,一般对象都是在堆均分拨的。

线程创建后,它的栈大小就不可再改变。

线程可以使用new或是User::Alloc从线程默许堆均分拨内存.如果但愿从其它堆均分拨内存,只能使用new

动态库(DLL)

symbian中dll不复旧可写的静态数据,是以你在里面不可能使用可写的全局变量或是静态变量.

为什么不复旧呢?如果复旧,那每个程度调用这个dll时,都需要为这个程度分拨一个孤独的堆,而堆最小单元是4k,系统中有许多堆,况兼有很

多设施,是以内存耗尽基金是很大的。是以就不复旧了

这样开发时不是很不便捷?因为在dll中偶而需要保存我方的景象,进行交互

为了处分这个问题,symbian中引入了线程腹地数据(thread-local storage

TLS)宗旨(检察Dll::Tls

Dll;;SetTls)。关联词调用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线程都是事件处理器,每个线程有一个步履调遣对象,加上一个或多个步履对象来处理从设备或其它设施发过来的事件。

每个步履对象都有一个臆造的成员函数RunL(),在这个函数里面处理事件。

多任务与霸占式

symbian os收场霸占式多线程。

步履对象用于在单个线程内收场非霸占式多任务

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

SymbianOS6.X Series60界面的智能手机基本手机构造..

SymbianOS6.X Series60界面的智能手机,在插入MMC之后,系救援般存在4个逻辑存储驱动器:C(手机自身的用户存储,SX1有4M),D(臆造

盘,使用平静运行内存臆造的缓冲盘),E(MMC),Z(手机的系统ROM只读)。

4个盘之中,C E Z盘的文献结构大同小异。而D驱动器是高速的臆造驱动器,主要用来保存剪贴板、wap缓存、和一些临时交换文献,一般情

况下,由系统自动调用,与用户酌量未几,不作详备先容。底下我具体的将C E Z三个驱动器的目次结构和功能讲授一下。 跟着安设软件的增

多,C和E盘的目次文献会变得纷纭复杂,我们抛开一些软件自动生成的次要的文献和目次收拢系统的结构谈一些主要的东西:

E盘根目次下:IMAGES SOUNDS VIDEOS目次,顾名念念义便是保存了图片铃声视频编著,这3个目次等效的出当今C和Z的Nokia目次下,也便是

说把相应类型的文献拷贝到对应的目次都可以被系统识别(Z盘只读之外),例如说明:midi文献或者wav文献拷贝在E:soundsdigital或者

C:nokiasoundsdigital就可以像Z:NokiaSoundsdigital中固化的音乐文献一样,出当今情景模式铃声的采取项目中。

C:Nokia是个不关要紧的目次,你皆备可以删掉它而莫得影响,关联词这个目次会往往自动生成。原因是,C盘的Nokia目次中有尽头的目次:

INSTALL,很显著这个是为了安设软件而诞生的。人所共知,Symbian系统的软件是打成SIS压缩包传脱手机的某个存储器中(C、E)然后解包安

装的,系统往往在C:NOKIAINSTALL目次下保存一个安设副本,以备安设时遭受不可料到的不实(如片刻没电)或者用户中断时概况还原系统

安全,这也便是很厚情况下,在空余很大空间的E盘安设软件时,仍然出现“存储空间已满”的原因,保持C盘有1M以上的空余空间是个很好的

民风。另外不使用系统的manager转而使用SeleQ进行SIS安设也可以幸免产生这个副本。

底下以分析一下结构最为复杂的系统中枢C:system目次。System目次由十几个目次和些许文献构成:

※APPS目次:该目次下的子目次保存了软件的主体即:用户交互可扩充文献.app、 资源文献.rsc、 图标文献.aif 、无界面可扩充程

序.exe以及运行所需的其他文献。安设在E盘的软件除了在E:SystemApps目次下保存软件主体之外,往往会在C:SystemApps同神情录下创

建一些树立文献。值得细心的是C:Systemappsphoneoplogo保存了营运商的标志,如果该目次保存了97*25的bmp图像,则在待机景象下将以

该图片代替“中国出动”之类的营运商标志(需要从新启脱手机);

※BootData目次:系统的启动参数和日记;

※Data目次:极其芜乱的目次,保存了多样千般的数据,粗造先容几个,backgroundimage.mbm壁纸,btstate.dat蓝牙配对信息,

Calender日期,clockapp.dat时间参数,Contacts.cdb酌量东说念主,以及许多软件的树立文献和wap信息;

※favourites目次:保藏夹;

※install目次:保存了全部的软件安设信息,每安设一个软件,就在该目次下保存一个同名sis文献索引,大小在几百b到几K不等,假如

删除这个sis文献,在设施管理中就不会出现这个软件的安设信息,也就无法通过设施管理删除,关联词仍然可以在apps目次中顺利删除软件主体

和树立文献,有必要的话在libs目次中删除相应运行库,在programs目次中删除相应接济运行文献,从而透顶卸载软件;

※libs目次:保存某些软件运行时需要的伙同库文献,一般由软件安设;

※mail目次:信息目次,结构复杂用解,除了一些短信、彩信、EMail诞生文献之外,收件箱、发件箱、草稿箱、发送叙述、附件等等散播

在丛深复杂的目次之中。值得一提的是,S60的信息宗旨比拟广,短信彩信Email致使红外蓝牙传输的文献都属于“信息”,因此接受到的红外

蓝牙的文献,保存在mail目次下,而且可以由检察该信息触发相应的“安设”、“不雅看”、“编著”等动作;

※MIDIets目次:java树立文献;

※midp目次:java设檀越体安设在这里,如果全部java安设在E盘,C:system将不会出现这个目次;

※Programs目次:保存接济运行文献,和一些无界面设施exe、动态伙同库dll;

※Recogs目次:关联目次,里面的mdl文献象征了文献关联。如QuickWord.mdl象征了系统中的doc文献默许由quickword大开,另外有些mdl

文献会驱动设施运行,如eLoader.mdl驱动了miniGPS、ExtendProfile等ePsint公司开发的软件,莫得这个mdl文献,以上两个软件不可自动加

载;

※Schedules目次:顾名念念义,保存了日程安排;

※SharedData目次:全部是软件的树立文献.ini,对用户作用不大,关联词可以通过修改其中的某些数值和旅途从而使必须安设在C盘的软件

(多半是7650的软件,它莫得mmc)安设到mmc;

※Temp目次:临时文献。

E:system目次结构与C:system基本一致,不同的是,少了intsall目次。

Z:system比之C:system愈加雄伟复杂,它保存了系统的全部自带设施、资源文献、硬件驱动、字体字库、外欧化诞生和运转参数诞生。

在待机景象下输入*#7370#,将运革新手机,基本历程便是清空C盘,复制Z盘某些内容至C。某种程度上说Z是系统的运转备份。(生人机的第

一幅待机图就保存在Z:systemdataapac.mbm)

对于旅途问题。由于三个盘的system目次结构是相似的,是以同名旅途所起到的作用雷同,比如E:systemrecogs目次下的关联文献同样

可以起到关联作用,libs等目次类同(有些情况下将C的内容出动到E相应旅途中,需要在C:systemSharedData对相应的ini文献进行修改)

,而在E(C):system下开发Fonts目次则可以加入新的系统字体。唯有install目次只是在C:system下才灵验。

了解S60系统的文献结构,对于我们使用手机有着很大匡助,可以最大限制的得到运行空间、了解不实产生的原因,有认知的幸免可能会带

来伤害的操作。本文只是对文献结构作念了初步的探讨和应用层面上的诠释,进一步的接洽可以在西门子和诺基亚论坛的官方文档得到全面解答

。但愿有所匡助。

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

数据类型 描摹

TInt8, TUint8 8位 整数

TInt16, TUint16 16位 整数

TInt32, TUint32 32位 整数

TInt, TUint (32位)整数

TReal32,TReal64 实数

TText8, TText16 字符, 尽头于 unsigned char, unsigned short int

TBool 布尔

TAny 尽头于void

代码范例

Symbian OS 使用许多代码范例, 使用他们可以增强Symbain 代码的可读性, 有些范例致使是需要严格顺从的, 比如类的定名:

Symbian OS的类一共有6种: 种类 例子 描摹

T classes TDesC, TPoint 这个类可以向基本类型一样使用,因为他们庸碌很小,而且不使用heap是以也莫得析构函数

C classes CConsoleBase, CActive 这个类是Symbian使用最多的类,C代表他们从CBase类袭取而来, 他们必须有析构函数因为他们的对象创

建在heap中

R classes RFile, RTimer R代表资源(Resource),它们只是一个系统资源的句柄,他们自身被创建在Stack上, 关联词他们所使用的资源被创

建在heap上,使用收场需要Close()

M classes MEikMenuObserver 这个类是一个空的接口,使用的时候需要从它袭取

static classes User, Math 这个类唯有静态函数, 一般都是库函数

Structs SEikControlInfo c - struct

变量定名:

种类 例子 描摹

陈列 EMonday,ETuesday E代表陈列

定量 KMaxFileName K代表定量

成员变量 iDevice, iX i代表成员变量

参数 aDevice, aX a代表参数

局部变量 device, x 局部变量莫得固定的范例

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

对Symbian一无所知,天然只能从基础学起了,也许看一个例子再来望望基础更粗造些。而我这东说念主比拟守旧,便是学不会这种要领,还只能从基

础开头。

Symbian的字符串和描摹符:

TPtrC、TBufC、HBufC 是从TDesC派生而来的具体的描摹符类型。TPtr和TBuf这两个都是从TDes派生来,而TDes又是从TDesC派生而来。因此

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

TDesC

/ |

/ TBufCBase TDes

TPtrC

| |

TBufC、HBufC Tptr TBuf

TDesC和TDes是轮廓类。

_LIT它把一个象征和一个笔墨值聚积起来,况兼产生TlitC,TlitC的二进制体式与TBuf的二进制体式是一样的,因此可以把TLitC作为TDesC类

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

_L产生一个TPtrC,况兼无须制定称号也可以用。 const TDesC he = _L(he);

_L与_LIT的区别就在于寄明月 裸舞,_L需要开辟临时的栈区。



Powered by 小萝莉穴 @2013-2022 RSS地图 HTML地图

Copyright Powered by站群 © 2013-2024