用Carbide.c++开发Symbian入门
Symbian
系统简介
当前有很多手机
运行Symbian OS
,
数量甚至超出您的想象。到目前为止已经有超过7500 万、100 多种型号的手机运行Symbian
OS。这些电话大部分都形态迥异:有的配有键盘,有的采用笔控输入;有的配备TFT 彩色屏幕,有的则配备黑白LCD
显示屏;有的擅长于音乐播放,有的专注于电子游戏、图像处理甚至电视功能;有的手机面向个人消费者,有的专门针对商务用户;有的是为单手操作设计的,有的
是为双手操作设计的——种类繁多不一而足。Symbian OS 手机受到广大消费者的喜爱。仅2005 年就售出3400 万部Symbian OS
手机——这相当于每不到一秒钟就有一部Symbian OS 手机被出售。网络运行商同样青睐Symbian OS 手机。全球有250
多个移动电话网络运行商选择了Symbian OS 手机。所有这些都表明现在市面上有成千上万的手机是基于Symbian OS
的,所以为symbian系统开发的应用程序会得到广泛的应用。现在已经有5400 多种商业性应用软件可供Symbian OS
手机应用。本教程旨在为您提供一些编写Symbian OS 应用程序的入门知识。希望它会对您有所裨益,为开发Symbian OS
应用程序打下一个良好的基础。
开发语言
从开发初期起,Symbian OS
就是专门为移动电话而设计的,因此从弹性的电源管理(resilient
power-management)到内存资源的谨慎使用,全都是为了满足手机操作系统的特定需求。作为Symbian OS
的开发人员,您将受益于Symbian OS 这样一个专门为移动设备而创立并随着市场一起发展的开发平台。Symbian OS
最“基本”的编程语言是一种改进的C++。Symbian OS C++
经过特殊设计与优化,以利于降低手机电池能耗和内存使用。比如,为了节约电池耗电,所有Symbian OS
程序都是基于事件(event-based) 的,而当没有任何程序进行事件处理时,CPU
就进入休眠。您在开发软件时也可以使用Java、Python、.NET(使用Visual Basic 和带AppForge’s
Crossfire 的C#)、Perl、OPL和Adobe Flash,但是Symbian OS C++
是最强大(它允许最大限度的利用操作系统提供的所有功能)也是最快捷(因为它直接以编译码运行,而无需在运行时进行解译)的语言。这也就是为什么我们在本
书中选择C++ 来向您演示如何进行Symbian OS 开发的原因。好了,闲言少叙,让我们言归正传。
准备工作
首先您需要有一台电脑能创建并测试在Symbian OS
手机上运行的应用程序。这也就是说电脑要有一个较快的CPU
处理器(至少1.5GHz)和相当大的RAM(512MB或更大)以及一个大容量硬盘(至少有2GB 剩余空间)。该电脑必须能运行Windows
2000 或XP 操作系统。然后您需要开发软件来帮助您编写代码并进行编译。这可通过包含编辑程序(editor)、编译程序(compiler)
和链接程序(linker) 的集成开发环境(IDE) 来完成。在这推荐两种适合Symbian OS
程序开发的IDE。对于开发非商业用途的Symbian OS 应用程序,Nokia 的Carbide.c++ Express
版本是最理想不过了,它建立在Eclipse IDE 的基础上,供免费下载。对于使用Visual Studio.NET 2003
的程序员来说,也可选择Carbide.vs。这是一套基于Microsoft Visual Studio .NET2003 IDE
的工具,用于开发S60 和Series 80 软件。您还需要软件开发包(SDK), 专门用来编写和创建Symbian OS
应用程序。基于不同手机类型,有不同版本的SDK 供选择,具体使用哪个SDK
请见以下几页的说明。如果您还没有决定具体的手机类型或平台而无法确定选择哪个SDK,我们建议您一开始可使用S60 和UIQ
SDK。如果您想为最新款的手机(如Nokia 3250、E60、E61、N71、N80、N91、N73
或N93)编写应用程序,那就选择基于Symbian OS v9 的SDK(UIQ 3 或S60 第三版),要么您就选择更低版本的SDK(UIQ
2.1 或S60 第二版)。
不同版本的Symbian OS 之间有什么区别?主要的分别是,在Symbian OS 9.1
版本之前,为较低版本的Symbian OS编写的软件往往可在较高版本上运行,但9.1 版本与以往的版本截然不同。如要运行在9.1
版的Symbian OS 上,应用程序必须稍加修改并进行再次编译。
接下来您需要下载您所选择的IDE 和SDK。以下章节将向您介绍如何在互联网上找到这些工具。
S60 平台
平
台是一个完整的应用程序包(package),用户接口和构建于Symbian 系统技术的开发工具。S60 用户接口 (UI)
经过精心的设计,方便用户使用,便于单手操作。从用户的角度看来,该平台最大的特点在于它的用户界面:大的彩屏和各种输入键(两个软件键,
五方位的导航键,和几个专用的键)。
单手操作和大彩屏的优点能使应用程序开发者提供更有吸引力的内容和提供更方便的导航功能,同时增加用户使用手机时的愉快体验。
目前,s60平台上已经存在各种各样的应用软件. 其中最重要的有:高级智能电话应用程序,个人信息管理应用程序(PIM)(例如, 电话簿,日历, 相册), 短信, 网页浏览, 电子邮件和应用程序安装引擎,它能够让您自由地从电脑上下载软件到您的手机上。
第三版本支持两种不同的外观:
QVGA Portrait (240x320)
QVGA Landscape (320x240)
如何选择SDK
基于Symbian OS 的手机外型各异,用户界面(UI)
也不尽相同。为了给特定的用户界面编写应用程序,您必须选择特定的SDK(尽管应用程序的引擎往往与用户界面无关)。大部分运行Symbian OS
的手机采用的是S60 用户界面并使用键盘操作。S60 已经发布了一系列版本,选择正确的S60 SDK 和相应的Symbian OS 十分重要:
其它大部分基于Symbian OS 的手机采用笔控输入的UIQ 用户界面。以下网站列出了基于各版本的UIQSDK 的手机机型www.symbian.com/developer/sdks/sdks_uiq.asp
Carbide.c++ 集成开发环境(IDE)
前面已经提到了各种集成开发环境,这里我们主要介绍Carbide.c++的集成开发环境。
Carbide.c++的集成开发环境(IDE)基于Eclipse集成开发环境版本3。增添了能使Eclipse处理symbian c++
源文件和编译Symbian工程的插件。这些插件分为以下几类:
C/C++开发工具箱(CDT)。这是一个使得Eclipse管理和编译symbian工程的工具集
Symbian插件。这些插件由symbian开发,使得eclipse能够处理Eclipse C++的概念,同时提供对Symbian操作系统软件开发工具箱和Symbian工具链的支持。
Nokia插件。由Nokia开发,提供对Symbian操作系统工具箱的更多支持。插件实现了C++编译器,symbian系统的调试器,并且加入了Carbide.c++系列产品的商业版本的高级特性。
很明显,因为Carbide.c++是基本的Eclipse集成开发环境,开发者可以进一步定制其它的商业或免费的插件,比如说,一个版本控制系统,一个UML建模系统等。
有自己的安装程序,所以安装比较简单。在启动这个产品之后,用户看到的集成开
发环境和Eclipse开发环境十分类似,如下图所示,因为Carbide.c++是设计用于处理symbian
c++应用程序的,所以其集成开发环境的左边显示的是c/c++工程视图,这个视图用于显示构成一个典型symbian
c++工程源文件、头文件,资源文件。
开发环境的构建
第一步:安装JDK5.0
第二步:安装ActivePerl(需要5.6.1以上版本)
第三步:安装Symbian sdk
第三步:安装Carbide.c++1.2 版本。 Carbide有不同的版本。 其中Express版本是免费安装的,但不支持UI设计功能,也不支持在手机上调试的功能。
文件目录的布局
在动手写代码之前,我们有必要了解工程的文件组织结构。如果您看过SDK中的例子工程,或是用IDE的工程向导创建一个UI应用程序,您就会了解一个典型的工程文件结构布局是怎样的。
当工程增长到一定程度的时候,好的文件目录布局将有助于帮助跟踪代码的变更。工程中包含了各种不同类型的文件,包括源文件和其他类型的文件,我们通常将这些文件分开来存放,下面我们简短地介绍这些文件。
资源文件, 例如 .bmp 或 .wav 文件, 通常被单独地存放在一个目录下面。 测试代码也会和产品代码分开来存放。所以,一个典型的UI 应用程序会有如下这样一些目录结构和文件。
文件目录
|
存放文件类型
|
data (S60)
|
存放资源规格文件(.rss)
|
Gfx (S60)
|
应用程序资源文件,例如图片和声音文件。
|
Group
|
该目录存放工程文件 (例如 .mmp 和 bld.inf)
|
Images (UIQ)
|
应用程序资源文件,例如图片。
|
Inc
|
该目录存放头文件 (typically .h, .hrh 和 .inl)
|
rsrc (UIQ)
|
存放资源规格文件 (.rss, .ra)
|
src
|
该目录存放 .CPP 文件
|
Test
|
存放测试代码
|
工程定义文件 (.mmp file),这个文件对要编译的工程进行描述,并定义要构建的资源文件。该文件是环境无关的,编译工具用它来生成针对各种目标环境下的make files文件。
组件描述文件(bld.inf), 这个文件列出了一组相关的工程, 并包含一些编译指令.
都能够导入工程定义文件,并用它来在IDE环境下创建工程。下面详细描述这些文件的格式。
组件(component)描述文件: bld.inf
是
一个文本文件。它的内容非常繁琐,主要包括工程定义文件mmp和其他的任何编译工具所需要的文件。该文件分为多个节,其中,mmp文件列表在
PRJ_MMPFILES节中。即使一个工程文件只包含一个mmp文件,bld文件仍然是必须的。下面是一个典型的bld.inf文件。
//
目标平台 PRJ_PLATFORMS
WINSCW GCCE // 从工程中输出的文件 PRJ_EXPORTS
// None // 工程定义文件 PRJ_MMPFILES filebrowseapp.mmp // 工程定义文件(测试代码用) |
在
上面的例子中, 如PRJ_PLATFORMS 声明所示,默认情况下工程被编译为针对WINSCW平台和 GCC-E平台的执行代码。
当您用CodeWarrior为模拟器编译代码的时候,您使用的是WINSCW 平台, WINSCW的来由是,最终的代码运行于Windows,
单线程模式(in a Single process),并用CodeWarrior编译。
平
台的名称用来标识最终的可执行代码所运行的那个平台。 所以, 当上面的代码被编译完后,可执行程序被放在
/epoc32/release/winscw 目录下面(根据是调试(debug)版本还是释放(release)版本,被放在 /udeb 或
/urel 子目录下面)。
工程描述文件 (mmp)
mmp
文件中的每个语句都以一个关键字开头。下面是一个典型的mmp 文件的例子。
// filebrowseapp.mmp
TARGET filebrowseapp.exe TARGETTYPE exe UID 0x100039CE 0xE80000A6 VENDORID 0 #ifdef __WINSCW__ SOURCEPATH ../src SYSTEMINCLUDE /epoc32/include SOURCEPATH ../data START RESOURCE filebrowseapp.rss START RESOURCE filebrowseapp_reg.rss START RESOURCE filebrowseapp_loc.rss LIBRARY euser.lib efsrv.lib cone.lib eikcore.lib eikcoctl.lib eikdlg.lib egul.lib eikctl.lib apparc.lib |
TARGET
|
该关键字指明了目标文件(
exe 或 dll 文件)的名称。 |
TARGETTYPE
|
该关键字指明了工程所产生的目标文件的类型,在上面的例子中,我们生成了一个可执行文件。在大多数情况下,目标文件的类型为
dll,exe 或是其他的插件( plugin )。 |
UID
|
目标(通常指可以执行的
.exe 或 .dll 文件)具有三个 UID ,这些 UID 用来标识组件,第一个 UID 是无须指定的。因为它是编译工具根据目标的类型自动分配的。所以这里所指定的实际上是 UID2 ,这个值进一步指明了目标的类型,上面例子中,值( 0x100039CE )指明了目标文件是一个应用程序, Symbian 系统使用这个值来标识所有的应用程序。下一个指定的 UID 对每个应用程序来说都是唯一的。它标识了这个应用程序的注册资源文件和该程序的安装包文件 .pkg 。所以为了保证这个值的唯一性 , 您必须要向 Symbian 申请这个 UID ,由他们负责从数据库中为您的应用程序分配一个 UID 。可到 Symbian 的网站上了解更多的相关信息。有一些 UID 的值是用来测试的,例如 SDK 中的例子:文件系统浏览应用程序( filesystem browser )所使用的 UID 为 0xE80000A6, 您也可以在测试您的应用程序的时候使用这个值,但注意,不要在您的最终产品中使用它。 |
SECUREID
|
这是个可选的关键了,上面的例子中没有出现。该关键字为应用程序定义了安全标示符,用来指明这个程序可以访问哪个私有的目录。如果该关键字没有使用,用
UID3 来代替该关键字。 |
VENDORID
|
该关键字是在
Symbian OS v9.1 版本新增的。用来指定软件提供商的 ID 号。该关键字不是必须的,可省略。 |
CAPABILITY
|
这是
Symbian OS 9.1 新增加的关键字。 该关键字指明了应用程序的权限(或称作能力, 如:查看系统目录)。大上面的例子中 , 应用程序在模拟器上和在手机上被分配了不同的能力( capability )。在模器上,该程序被赋予了 AllFiles 的权限 , 比在手机上运行时,能看到更多的私有文件系统的区域。没有被赋予 AllFiles 能力的程序不能看到 /Sym 目录下的内容。 应用程序只有在经过认证( certificate )以后才能获得 AllFiles 的能力。关于认证和签名的内容,我们在这一章的后面会讲到。 |
SOURCEPATH和SOURCE
|
SOURCE
关键字指明了有哪些源文件和资源文件需要编译, 而 SOURCEPATH 关键字指明了这些文件的位置。这个位置既可以是相对路径(相对于 mmp 文件),也可以是绝对路径。 |
SYSTEMINCLUDE
|
这个关键字指定了系统头文件的位置,系统头文件通常用
#include<> 语句包含。 |
USERINCLUDE
|
该关键字的作用类似于
SYSTEMINCLUDE ,它指明了在用户自定义头文件所在的位置。 |
START RESOURCE…END
|
START RESOURCE
关键字表明了一个信息块的开始,这些信息指明了如何编译资源文件。 END 标示该信息块结束。 |
TARGETPATH
|
该关键字用来指定被编译后的资源文件的位置。注意
: 由于安全方面的考虑,所有的可执行代码( exe 或 dll )都从手机上的 /sys/bin/ 目录运行。可执行代码不需要用该关键字指定位置。 TARGETPATH 关键字仅仅用来指定编译后的资源文件的位置。 |
HEADER
|
这是一个可选的关键字,
当它被使用的时候,系统将会在 /epoc32/include/ 路径下创建资源头文件( .rsg )。这个头文件包含了允许以 C++ 代码引用特定资源的标识符。 |
LIBRARY
|
这个关键字列出了应用程序需要链接的库文件。
|
STATICLIBRARY
|
该关键字用来指定需要被静态链接的库文件
( 库文件中的代码会被链接到您的程序中,而不是需要时才装载到内存 ) 。 |
START BITMAP…END
|
这一节包含了应用程序图标所使用的位图(
bitmap ),以及如何将这些位图编译成 .mbm ( Symbian 系统专有的图像格式)的方式。 |
EPOCSTACKSIZE
|
该关键字是可选的,我们上面的例子中并未用到。在以前的
Symbian OS 版本中,缺省的栈大小为 0X5000 字节。在 v9.1 版本中,缺省值为 0x2000 。为了增加栈的大小,可以使用该关键字。例如: EPOCSTACKSIZE 0x5000 。要注意的是 , 对栈设置仅仅对真实设备有效,但对模拟器无效。 |
EPOCHEAPSIZE
|
该关键字也是可选的,我们上面的例子中并未用到。这个关键字指定了应用程序可以使用的最大、最小堆空间。缺省情况下,
4K 为最小的尺寸, 1M 为最大的尺寸。 |
第一个程序: HellowWorld
创建工程
在模拟器上运行和调试
工程建立完成后,就可以构建(build)工程了。在将程序放到手机上运行之前,我们通常需要先在模拟器上运行、调试程序。模拟器是SDK附带的一个软件,能够模拟真实手机的运行情况。
在工程透视图中,选中工程,点击右键,将活动构建设置为 Emulator Debug(Winscw)。如下图所示:
,选择Run As->1 Run Symbian OS Application
在手机上运行和调试
基本概念
能够在模拟器上运行、调试程序后,您可能想要在真实的手机上运行您的程序。但在这之前,先需要搞清以下几个基本概念:
GCCE版本和ARM版本:
在真实设备上运行的程序版本不同于我们在模拟器上运行的程序版本,在设备上运行的版本必须是GCCE版本或ARM版本。其中GCCE版本是用SDK 自带的编译器的,使用它不需要付费,而ARM版本是专门针对ARM 平台的,代码经过优化,性能优于GCCE版本的程序,但需要付费。
.sis文件和.pkg:
创建应用程序的GCCE 版本以后,需要创建一个Symbian
安装文件(.sis)。从本质上来讲,.sis文件只是一个压缩文件,
它包含了组成应用程序所需的exe,dll,rss文件,和一些手机接收应用程序时所必须的信息(例如:语言种类,应用程序的UID)。现在的问题是,我
们根据什么信息来创建这个sis文件呢?答案在于pkg文件,
在创建这个文件之前,先需要创建一个pkg文件,pkg文件中包含了一些有用的信息,包括将工程文件拷贝到手机的哪个目录下面,程序的版本号等。
签名(sign):
在开发s60 3rd版本的应用程序时,
所有的 .sis
文件在安装到手机之前,必须被签名。如果您的程序没有用到capability或只用到了对所有的用户都开放的功能(utility),您可以使用自签名认证(Self Signed certificate)。当在自己的手机上调试程序时,这种方法特别管用。
机上调试代理(on-device debug agent)
:
如果想要在真实的手机设备上调试程序,需要在手机上安装机上调试代理,这个手机上的代理程序通过蓝牙或USB串行链路与调试器通信,在Carbide.c++调试器和目标机器之间的起到接口的作用。调试代理提供以下功能:
运行在Symbian 系统上作为调试代理。
为Symbian系统提供一个稳定的集成的接口
能被用来在真实的设备上调试应用程序
能烧入到系统镜像中,或是被安装的sis文件。
版本 和 UIQ 3rd 版本的设备上。
编译、运行应用程序的手机版本
编译这个应用程序的GCCE版本.
创建Symbian 安装文件(.sis)。
给.sis文件签名。
在s60手机上安装这个sis文件。
运行该应用程序。
从菜单上选择 Project > Properties
选项.
在属性对话框上, 点击 C/C++ Build
。
从 Configuration
下拉菜单中选择 "S60 3.0 GCCE UREL
"。