SymbianOS开发培训InspurCommunicationInformationSystemsCo.,Ltd1I.SymbianOS概述1998年6月,诺基亚(NOKIA)、摩托罗拉(MOTOROLA)、爱立信(ERICSSON)、三菱(MITSUBISHI)和Psion在英国伦敦共同投资成立Symbian公司。这个公司成立的目的是为了能够设计并开发出一种可以在手机及其他类似的移动通讯终端产品上运行的开放性操作系统,以此来推动高端智能移动电话及类似的终端产品尽快进入大众消费领域。之后有西门子(SIEMENS)、三星(SAMSUNG)、松下(Panasonic)、索尼爱立信(SonyEricsson)等手机厂商相继入资,现如今,Symbian操作系统的智能手机已经占据了世界智能手机市场超过80%的份额。2I.SymbianOS概述Symbian是一个实时性、多任务的纯32位操作系统,具有功耗低、内存占用少等特点,非常适合手机等移动设备使用,经过不断完善,可以支持GPRS、蓝牙、SyncML、以及3G技术。Symbian是一个标准化的开放式平台,任何人都可以为支持Symbian的设备开发软件。与微软产品不同的是,Symbian将移动设备的通用技术,也就是操作系统的内核,与图形用户界面技术分开,能很好的适应不同方式输入的平台,也可以使厂商可以为自己的产品制作更加友好的操作界面,符合个性化的潮流3I.SymbianOS概述目前SymbianOS手机有三种开发SDK:NokiaSeries80:主要机型有Nokia9200系列NokiaSeries60:主要机型包括诺基亚7650、6600、西门子SX1等UIQ2、UIQ3:SonyEricssonP800,P900SonyEricssonP9004II.开发平台搭建•安装ActivePerl(x86和x64分别对应32位和64位cpu)•jre(java的应用平台)•SymbianOSSDK(建议安装在盘符根目录下)•(C++)开发工具5手机软件开发过程:II.开发平台搭建第一步:安装开发软件,搭建开发环境(下面主要介绍series60sdk,其余类似)第二步:在模拟器上开发调试(以VC环境开发为例)第三步:生成sis文件,在手机上安装运行6几种开发环境:II.开发平台搭建VisualC++6.0BorlandC++Builder6CarbideC++7II.开发平台搭建Symbian工程aifdatagroupincsrcsis工程基本目录结构:1.aif用来存放程序图标2.data用来存放运行所需要的资源文件.rss。3.group中比较重要的几个文件:bld.inf、*.mmp。4.inc和src存放工程头文件和源代码文件。5.sis用来存放程序打包所需要的pkg文件,打包后生成的安装文件.sis也存放在此处。81.bld.inf声明build的相关信息通常只包括这次build会引用到的mmp文件。例如:PRJ_MMPFILEShello.mmp2..mmp文件保存工程编译相关信息,主要内容如下TARGEThello.app//目标名称TARGETTYPEapp//目标类型UID0x100039CE0x07B9DE87//UID唯一系统标示符TARGETPATH\system\apps\hello//目标路径SOURCEPATH..\src//源代码存放位置SOURCEhelloApp.cpp//源代码列表…II.开发平台搭建9SOURCEPATH..\data//资源文件路径RESOURCEhello.rss//资源文件LANGSC//默认英语USERINCLUDE.USERINCLUDE..\inc//头文件路径SYSTEMINCLUDE.\epoc32\include//系统包含文件目录LIBRARYeuser.libapparc.libcone.libeikcore.libLIBRARYeikcoctl.libavkon.lib//库文件3.UIDUID1-第一个UID(类型):UID1用来设定该应用程序是一个执行程序(executablefile)还是一个数据文件(datafile).UIDvalueNumericvalue(Hex)MeaningKExecutableImageUid0x1000007A.exe可执行文件KDaynamicLibraryUid0x10000079.dll.app.ldd,.pdd文件KDirectFileStoreLayoutUid0x10000037directfilestoreKPermanentFileStoreLayoutUid0x10000050permanentfilestore10UID2-第二个UID(子类型):UID2-具体含义取决于UID1的值:如果UID1是KExecutableImageUid,UID2不使用,所以UID2的值可以随意取。如果UID1是KDynamicLibraryUid,UID2将会是:如果UID1是KDirectFileStoreLayoutUid或者KPermanentFileStoreLayoutUid,那么UID2将是:UIDvalueNumericvalue(Hex)MeaningKSharedLibraryUid0x1000008D.dllKUidApp0x100039CE.appKLogicalDeviceDriverUid0x100000AFalogicaldecivedriver(.ldd)KPhysicalDeviceDriverUid0x100039D0aphysicaldevicedriver(.pdd)UIDvalueNumericvalue(Hex)MeaningKUidAppDllDoc0x10003A12indicatesthisisafilestorecreatedbyan.apptostoreuserdata(i.e,adocument)KUidAppInfoFile0x10003A38IndicatesthisisanAIFfile(atypeoffilestore)11UID3-第三个UID(子子类型):每个独立的应用程序有一个唯一的UID3值,它也被用作安全ID(secureID),对于UIKON应用程序而言,用于关联数据文件和程序:1.对于dll和exe文件,它辩识特定的二进制(itidentifiedtheparticularbinary)。2.对于.app(UIKON应用程序),它辩识特定的应用程序(itidentifiedtheparticularapplicationprogram).3.对于由.apps创建的文件存储(filestores),它辩识和该文件相关的应用程序(itidentifiestheapplicationprogramassociatedwiththisfile).4.对于其他文件存储(filestores),它没有典型的用途(但是你可以自定义它的用途)12Symbian命名约定Symbian大致分了四种类C:C前缀表示类从CBase派生并应该基于堆构造。T:T前缀表示一个简单类,这种类不拥有任何额外的资源。如Tint、TReal等基本数据类型。R:R前缀表示一个资源类,它包含其它位置拥有资源的句柄。M:M前缀表示一个接口类,它定义了接口但需要派生类实现。结构(struct)类型作为T类对待,因为它也不拥有任何额外的资源,它的前缀通常是T(但也有一些以S开头)。enumTColors{ERed,//尽量用E开头,尽量用枚举EGreen}成员变量的名字以i开头,参数名以a开头classTMyClass{TIntiMyValue;voidMyAddFunc(TIntaArg1,TIntaArg2);voidMyAddFunc(TIntaArg1,TIntaArg2);voidMyAddFuncL(TIntaArg1,TIntaArg2);--------后缀L的约定是该函数可能产生异常退出;voidMyAddFuncLC(TIntaArg1,TIntaArg2);----------后缀LC的约定表示成功完成之后,返回值会被压入清理栈中;(栈不保存)};Symbian编程规范和基本框架13Symbian命名约定常量应加前缀KconstCIntKMyconstant;宏全部为大写#defineMY_HARDCODED_VALUE(25)Symbian四个主要的应用软件框架类针对右图Graphics,UI程序应该具备的基本功能类:视图(View)、文档(Document)、应用程序(Application)、应用程序UI(ApplicationUI)。所有的S60UI应用程序都具有一些基本功能:提供一个用户界面,用于显示信息并允许用户进行交互。响应各种用户启动的事件,比如用户选择一个菜单项。响应系统启动的不同事件,比如导致屏幕重绘的window服务器事件。能够保存和恢复应用程序数据。可以唯一性的向框架标志自身。向框架提供有关应用程序的描述性信息,比如图标和标题等。Symbian编程规范和基本框架14Symbian四个主要的应用软件框架类一个程序只能有一个文档,可以有多个视图。必须创建下面的每个方法,才能提供最小的S60应用程序:所有S60UI都实现一个全局函数E32DLL(),当应用程序启动时,框架将首先调用该函数,该函数也称为DLL入口点,应用程序必须存在该函数。框架调用NewApplication(),创建Application类,其基类是CAknApplication.Application类创建应用程序类的Document对象,并返回它的指针,以后框架使用该指针完成应用程序的创建。由框架调用AppDllUid()返回应用程序的UID。该函数必须返回在.mmp文件中指定的值。Document基类是CAknDocument.Document对象通过CreateAppUiL创建获取AppUi类的指针。AppUi类的基类是CAknAppUi或者CAknViewAppUi,它是用来处理应用程序事件,如操作菜单,操作视图,切换视图等等。View是控制类(c类),在屏幕上显示数据,用户与界面交互,传递命令给AppUi。Symbian编程规范和基本框架15Symbian处理内存泄漏的手段1.Trap和TrapD处理异常TInterr;Trap(err,CreateObject());//需要先定义err变量TrapD(err,CreateObject());//不需要定义err变量2.CleanupStack它是处理内存泄漏的又一重要手段CFoo*p=new(ELeave)CFoo();CleanupStack::PushL(p)p-SomeFunctionL();//可能异常退出,使得deletep得不到调用CleanupStack::Pop();deletep;Symbian二阶段构造在Symbian中,如果在一个类的构造函数中需要执行某些比如申请内存等操作,那么有可能会Leave。如果Leave的话,这个时候这个类的析构函数是不会被调用,因为还没有初始化完,也就没法把自己加入CleanupStack,那么那些申请了的内存可能会因为没有变量引用而造成内存泄漏。因此在Symbian中类的构造函数中不能有可能会Leave的代码。Symbian编程规范和基本框架16Symbian二阶段构造初始化一个类确实需要执行某些可能会Leave的函数,这就是Symbian中要求的两阶段初始化了。第一阶段,也就是在构造函数中执行一些不会Leave的初始化工作。然后是第二阶段,把这个实例推进CleanupStack,再执行第二阶段的可能会Leave的代码。当然,在析构函数中,要能够处理部分初始化的情况,也就是实例没有初始化成功,也能释放那些已经申请的内存或资源。CGraphicsAppV