Symbian OS介绍 陈永华 2008.5.30 2018/12/30
主要介绍内容: 一、基本简介; 二、OS60版本分类; 三、开发环境搭建; 四、基本数据类型; 五、命名规则; 六、内存管理机制---异常退出和清除栈; 七、描述符; 八、真机移植 2018/12/30
一、基本简介 Symbian是当前和未来的最重要的主流智能手机操作系统之一。 Symbian是一个实时性、多任务的纯32位操作系统,具有功耗低、内存占用少等特点,非常适合手机等移动设备使用,经过不断完善,可以支持GPRS、蓝牙、以及3G等技术。Symbian主要用于高端的智能手机,其开发语言为C++。Symbian 是真正的微核操作系统,所谓“微核”,就是说操作系统只有很小的一部分是运行在最高优先级的,其他的功能都是以Client-Server的方式提供。 2018/12/30
二、OS60版本分类 Series 60 第一版OS 6.1 Series 60 第二版OS 7.0s Series 60 第二版Pack 1 OS 7.0、8.0a、8.1a; Series 60 第三版OS 9.1 、9.2、9.3、9.5 2018/12/30
开发包支持的集成开发环境工具有很多种,主要如下: 1、Microsoft Visual Studio 6 / Visual C++ 6 2、Microsoft Visual Studio .NET [2003] / Visual C++ 7 3、Microsoft Visual Studio .NET [2005] / Visual C++ 8 3、Borland C++ Builder 6 4、Borland C++ Builder X 1.0 5、Metrowerks CodeWarrior Studio for Symbian Personal/Professional 2.0/2.5 特别注意:版本不同,应用功能不同,每个版本严格对它的操作系统与SDK,版本应用向前不完全兼容性,移植时特别注意。第三版是现在的主流,更是将来的主流,现在我们用的是主流版第三版OS9.2 ,开发环境: VC2003。 2018/12/30
三、开发环境搭建 准备工作: 1)安装好microsoft office frontpage 2)XP组件中的IIS项中的frontpage扩展; 3)准备下列软件: ⑴ ActivePerl ⑵ J2RE ⑶ Series 60 SDK(即S60 3rd Edition FP1) ⑷ Microsoft Visual Studio.Net 2003 ⑸ Carbide.vs 注:由于开发需要,建议同时安装S60 2rd Edition pack2 FP2 2018/12/30
1)安装Microsoft Visual Studio.Net 2003。建议安装在C盘下program files,选择默认安装; 安装工作: 做好准备工作后,开始环境安装,一共需要安装下列软件,且按如下安装顺序: 1)安装Microsoft Visual Studio.Net 2003。建议安装在C盘下program files,选择默认安装; 2)安装ActivePerl 。建议安装在C:\symbian目录下; 3)安装J2RE。建议安装在C盘,选择默认安装 4)安装S60 2rd Edition pack2 FP2。建议安装在C盘,选择默认安装 5) 安装S60 3rd Edition FP1。建议安装在C盘,选择默认安装 6) 安装Carbide.vs。建议安装在C盘,选择默认安装 2018/12/30
① 打开VS.NET,新建symbian项目:命名为TestHello,确定 进入symbian project页面, 测试安装成功与否: ① 打开VS.NET,新建symbian项目:命名为TestHello,确定 进入symbian project页面, project type选:symbian 9 ----第三版工程; Classic ------第二版工程; project template选:S60 3rd Ed.Hello World Application, Select SDKs中选定打勾,finish 说明:WINSCW为在PC机上版本,GCCE为手机用版但可以都选择 编译、执行。 具体测试如下图所示: 2018/12/30
2018/12/30
2018/12/30
2018/12/30
2018/12/30
2018/12/30
四、基本数据类型 Symbian OS 使用的是面向对象的C++, 但是又和标准的C++有一些区别。 比如:Symbian OS没有标准的异常处理(Exception), 因为设计Symbian OS的时候C++还没有把异常处理标准化。 所以Symbian设计了自己得异常处理机制: TRAP, leave. 另外就是今天要讲的基本类型。 Symbian 基本上不使用任何标准的C++基本类型,不同的C++编辑器对int, unsigned int的长度理解不同, Symbian OS中使用TInt8,TInt16,TInt32。 如果没有某一特定的长度时,要使用Tint。其他很多类型也遵守这个原则。 比如TBuf8, TBuf16没有特定长度时最好用Tbuf。 2018/12/30
TText8 字符相当于 unsigned char TText16 字符相当于 unsigned short int 基本数据类型及描述 基本数据类型 描述 TInt8, TUint8 8位 整数 TInt16, TUint16 16位 整数 TInt32, TUint32 32位 整数 TInt, TUint 32位 整数 TReal32, TReal64 实数 TText8 字符相当于 unsigned char TText16 字符相当于 unsigned short int TBool 布尔 ETrue (= 1) EFalse (= 0) Tany 相当于void 2018/12/30
Symbian OS 使用很多代码规范,使用他们可以增强Symbain 代码的可读性, 有些规范甚至是需要严格遵守的, 比如类的命名: T 类 1、拥有 ’T’ 前缀,可以象C++中基本类型一样使用; 2、他们通常很小,一般分配在栈空间,但也可以在堆上建立,当存在潜在的异常退出(Leave)的可能时,指向类对象的指针应当首先压入清除栈中,然后再调用相关代码。 3、在发生异常退出后,T类对象的内存空间被收回,但是没有调用析构函数。如:TInt i,j; 2018/12/30
1、拥有 ’C’ 前缀, C类总是从 CBase 类上继承而来,C代表他们从CBase类继承而来,在e32base.h中定义; 1)安全的构造和析构,两阶段构造: 允许在构造的时候进行安全初始化 (例如, 内存分配) ,因为在构造时可能引起潜在的异常退出和内存泄露 两阶段构造是一种模式,其特点是所有的构造函数都是private或者protected类型,提供了静态工厂函数,通常称为NewL() 或者 NewLC(); 2.)成员数据零初始化 3、C类通常很大,包含的成员数据在创建阶段的初始化时可能会失败,例如分配内存空间或者打开一个资源句柄 如:CExample *example = new (Eleave) CExample; 2018/12/30
1、拥有 ’R’ 前缀,R代表资源(Resource) ; 如:Open(),Connect() , Initialize() , Close() 经常犯的错误就是忘记调用Close()方法 ,这可能导致严重的内存泄露 如:RTimer timer; timer.CreateLocal( );//创建本地时钟 … timer.Close(); 2018/12/30
1、也叫混合类,拥有 ’M’ 前缀,创建M类的目的是 — 定义一个接口 2、特点1)永远不含任何成员数据; 2)永远不含构造函数、析构函数或重载描述符,M类不可以实例化; 3)声明的是纯虚函数,用作抽象接口。 3、一个从M类派生的具体类通常是从CBase类继承而来的,从一个或者多个混合类派生,并实现其接口函数,正确的类继承顺序是,总是把CBase类放在最前面: class CCat : public CBase, public MDomesticAnimal{...}; 而不能: class CCat : public MDomesticAnimal, public CBase{...}; 4、举例:class MVideoPlayerUtilityOberver //视频播放类 { public: virtual void MvpuoOpenComplete(TInt aError) = 0;//设备打开 virtual void MvpuoPlayComplete(TInt aError) = 0;//准备播放 } 2018/12/30
五、命名规则----symbian命名很重要 作用:这样易于检查特定的清除相关的规则。 1、成员变量:定义时一般以i开头。如TInt iValue; 2、枚举变量:定义时起开名称以T开头,各成员以 E开头,如 enum TMonth {EJanuary = 1, EFebruary = 2, ..., EDecember = 12} 3、常 量 :以 K开头。如KMaxFileName; 4、函数形参:定义时以 a开头。如aDevice, Ax; 5、函数命名:第一个字母大写,后缀D表示对对象进行删除,后缀L表示有可能Leave,后缀C表示函数中有变量需要旋转于清理栈中;函数名称暗示了他们是做什么的。对于返回内部成员变量的函数,他的名称一般使用去掉首字母i的该变量名称。如: inline RWindow& Window() const { return iWindow; }; 6、自由变量:无明确前缘,但要求以小写字母开头等。 2018/12/30
六、内存管理机制---异常退出和清除栈 1、Symbian OS 被设计为可以在只有有限内存的设备上良好运行的系统,它使用清除栈来保证在错误发生时不会发生内存泄漏,如果一个函数可能会异常退出,它的名字结尾必须以“L”为后缀,这点非常重要。 2、Symbian OS 的两个最基本的编程模式是: 1)异常退出(Leave)轻量级的异常; User::Leave() 或 User::LeaveIfError(),近似于 C++ 中的 throw指令 TRAP宏,可以看作 try 和 catch 组合,每一个 TRAP对执行规模和执行速度有影响,TRAPS 的数量应尽可能减少 2)清除栈(Cleanup Stack),它是用来管理发生异常退出事件时的内存资源和其他资源的。 2018/12/30
典型的异常退出的例子 1.使用重载 new 操作符来分配内存 2.将一些对象压入清除栈顶端 3.调用一个可能异常退出方法 TInt UseCat(CCat* aCat); CCat* InitializeCatL() { CCat* cat = new(ELeave) CCat(); // (1) CleanupStack::PushL(cat); // (2) cat->InitializeL(); // (3) User::LeaveIfError(UseCat(cat)); // (4) CleanupStack::Pop(cat); return (cat); } 1.使用重载 new 操作符来分配内存 2.将一些对象压入清除栈顶端 3.调用一个可能异常退出方法 4.调用会返回错误码的非异常退出函数,该函数被一个会产生异常退出的系统函数所包裹 2018/12/30
清除栈 1、使用清除栈使代码成为异常退出安全, 这样在异常退出事件中不会发生内存泄漏 2、常用方法: CleanupStack::PushL() CleanupStack::Pop() CleanupStack::PopAndDestroy() 使用 __UHEAP_MARK 和 __UHEAP_MARKEND 宏来发现内存是否泄漏 2018/12/30
/*static*/ CFoo* CFoo::NewLC(TInt aVal) { 3、举例: /*static*/ CFoo* CFoo::NewLC(TInt aVal) { CFoo*self = new(ELeave) CFoo(aVal); // 第一阶段构造 CleanupStack::PushL(self); self->ConstructL(aVal); // 第二阶段构造 return self; } /*static*/ CFoo* CFoo::NewL(TInt aVal) { CFoo* self = CFoo::NewLC(aVal); CleanupStack::Pop(this); return self; } 2018/12/30
1、Symbian OS 的字符串被称为描述符; 八、描述符 1、Symbian OS 的字符串被称为描述符; 2、Symbian OS描述符不同于标准C++的字符串,Java的字符串或者MFC的Cstring,也不同于C的字符串; 3、它们的内存分配和释放必须由程序员来管理。 4、 Symbian OS的描述符可以包括文本和二进制数据 5、不能自动动态的扩展它们所引用的数据区,如果调用 某个方法使得要存储的数据大于可用空间就会导致系统 错误(panic) 2018/12/30
6、可以是窄(8位)的, 宽 (16bit)的或者为字符宽度无关的 (即16位,Symbian OS设置基于Unicode构建的) 7、被构建成支持unicode字符集,即缺省使用宽(16-bit) 字符 描述符类的字符宽度可以从名称中识别出来, 类名以8 结尾的描述符 (例如TPtr8)使用窄 (8位) 字符串 类名以16 结尾的描述符(例如TPtr16)处理16位字符串 8、TDesC 是所有描述符的基类,目前有六个描述符派生类 (TPtrC, TPtr, TBufC, TBuf, HBufC 和 RBuf) 9、描述符有两种基本结构 指针描述符 – 描述符拥有一个指针,该指针指向了其他某处存储字符串的地址 缓冲区描述符 – 字符串构成了描述符的一部分 2018/12/30
示例 2018/12/30
八、真机移植 Symbian OS 模拟器 1、Symbian 模拟器具有进程和线程调度,它跟真的Symbian OS手机硬件上的工作几乎是相同的 2、但是,也有一些区别 例如: 真机的内存模型与模拟器上的就有区别 底层硬件是不同的 不可能在模拟器和真机上使用相同的设备驱动器和硬件抽象层代码 因为这个原因 模拟器不能用于低级编程,例如编写设备驱动器 2018/12/30
移植到手机 1、为了构建Symbian OS程序,需要文件: 组件描述文件 (bld.inf) ——位于group文件夹 项目定义文件 (projectname.mmp) ) ——位于group文件夹 打包文件projectname.pkg ) ——位于sis文件夹 2、在模拟环境下设置编译方式带GCCE功能; 3、在模拟环境下修改group文件夹下bld.inf; /*注释部分,不被执行*/ PRJ_PLATFORMS ;平台说明 WINSCW GCCE PRJ_EXPORTS ; 列举一系列要从项目目录复制到另一个目录的文件 ;通常是 \epoc32 下面的目录 PRJ_MMPFILES ; 说明有哪些定义文件(MMP文件) project.mmp 2018/12/30
4、检查sis文件夹下打包文件(.pkg)路径是否正确 ; 移植到手机 4、检查sis文件夹下打包文件(.pkg)路径是否正确 ; ; helloworldbasic_gcce.pkg "..\..\..\epoc32\release\gcce\urel\HelloWorldBasic.exe" -"!:\sys\bin\HelloWorldBasic.exe" { "..\..\..\epoc32\data\z\resource\apps\HelloWorldBasic.rsc" "..\..\..\epoc32\data\z\resource\apps\HelloWorldBasic.r09" "..\..\..\epoc32\data\z\resource\apps\HelloWorldBasic.r31" "..\..\..\epoc32\data\z\resource\apps\HelloWorldBasic.r32" } 2018/12/30
5、编译、连连,重新生成打包文件*.pkg ; 6、在DOS下输入打包命令,主要如下: …>group>bldmake bldfiles …>group>abld build gcce urel …>group>cd. …>cd sis …>sis>makesis project.pkg 结果生成 project.sis (SIS 文件包含Symbian OS软件安装器安装一个应用程序到手机上所需要的所有信息) 7 、数字签名 symbian 第三版严格要求移植到手机的安装文件需要认证签名,需求不同,签名规格不同,签名后安装文件project.sis名称变为project.sisx 8、签名后的安装文件project.sisx拷贝到手机,直接安装即可运行。 2018/12/30
Thank you! 2018/12/30