Symbian OS 开发初级手册

Symbian OS 开发初级手册

Symbian OS 开发初级手册 (1) Introduction

Symbian OS是当前应用最为广泛的smart phone操作系统。 Nokia,Panasonic,Siemens,Sony Ericsson的很多手机都是基于这个系统的。 可惜国内关于Symbian OS 开发的资料实在很少。 所以我打算根据自己的(浅薄)的经验写一套初级教程,让更多的人了解Symbian OS.
说起Symbian OS, 大概很多人都会想到Nokia Series 60, 80等等。 每一个symbian 联盟手机厂商都会在纯粹的Symbian OS上面添加自己的东西。 Series 60 是Nokia 的一个非常流行的软件开发包,7650, 3650, N-gage等等都基于它。我在这里使用的例子都可运行于Series 60. 但是我在这里讲的概念是纯粹的Symbian OS 而不是series 60, 这样的好处在于:有了这个基础, 我们可以为任何一个使用Symbian OS 的手机开发, 而不会局限于某些Series 60等特殊的API。这样可以使你的开发成果能够运行于更多的设备上。
那么首先我们需要Series 60 SDK, 在 http://www.forum.nokia.com/main/0,6566,034-4,00.html 下载,安装sdk,详细步骤我就不在这里描述了。 如果有什么问题可以在这里问我。
安装之后,要测试基本路径是不是设置好了。 打开一个命令行窗口,输入 epoc , 如果你看到模拟器运行, 就说明已经安装好了。如果没有的话,请在提问的时候提供错误信息。
有了SDK,我们就已经可以开始开发了! 但是开发环境是很重要的, 任何Symbian OS程序都要涉及多个文件,Symbain 建议使用 Metrowork Codewarrior, 不过考虑VC6的普及程度应该更高,我在这里使用Visual C++ 6.0. 你也可以使用VC. Net, 不过目前中文sdk不支持vc7, 你需要下载英文版的。 以后命令行出现vc6的时候你就要使用vc7。
在讲解我们的第一个hello world程序之前, 我要简单说一下Symbian OS 工程的文件结构, 我们一共需要创建4种文件:
bld.inf 配置文件
*.mmp 工程文件
*.cpp 源代码文件
*.h 头文件
我们的hello world项目中, bld.inf 如下:
PRJ_MMPFILES
HelloWorld.mmp
只有简单的两行, 意思是: 这个配置文件将编译的工程有:Helloworld.mmp. Helloworld.mmp 稍微复杂一些,暂时不在这里讲解,你只需要知道它定义工程中都包括哪些源文件,哪些头文件,哪些lib文件就可以了。
基本的helloworld例子C:/Symbian7.0s/Series60_v21_C/examples/Basics/helloworld. 如果你的安装路径不同,需要相应改变。 由于实在很简单, 这大概是所有例子中唯一没有头文件的项目。Helloworld.cpp 如下:
#include "CommonFramework.h"
LOCAL_C void doExampleL()
{
_LIT(KHelloWorldText,"Hello world! ");
console->Printf(KHelloWorldText);
}
在我们讲解Descriptor之前你只需要知道_LIT把 "Hello world! "这个普通字符串转换成了Symbian OS的字符串格式,并储存在变量KHelloWorldText当中。 console->Printf(..)就是向命令行打印这个字符串。
那么现在我们需要编译这个工程,在命令行中进入examples/Basics/helloworld,输入bldmake bldfiles, 然后abld makefile vc6, 这是创建VC工程文件的基本步骤。 然后打开Visual studio,打开工作区, 在C:/Symbian/7.0s/Series60_v21_C/Epoc32/BUILD/SYMBIAN/7.0S/SERIES60_V21_C/EXAMPLES/BASICS/HELLOWORLD/HELLOWORLD/WINS 中。
分析一下这个巨长的路径你会发现,其实分为4段:
1。 C:/Symbian7.0s/Series60_v21_C/Epoc32 是全局环境变量%EPOCROOT%的所在,后我们在说这个路径的时候就用%EPOCROOT%代替。
2。build 这个目录存放abld 生成的项目文件。
3。SYMBIAN/7.0S/SERIES60_V21_C/EXAMPLES/BASICS/HELLOWORLD 是你的工程所在目录。
4。HELLOWORLD/WINS 是Helloworld项目, windows 模拟器,如果你为手机编译的话,就会是Helloworld/thumb.
然后运行的时候会弹出一个对话框要求可执行文件。 输入 %EPOCROOT%/release/wins/udeb/epoc.exe 然后你就会看到熟悉的"hello world"出现在s60模拟器上了!
先写到这里吧,但愿这些文字对大家有一点用处。 下一次我将介绍Symbian OS 的基本类型 和 代码规范
[这个blogger不能处理反斜线, 所以我只好用 '/'代替!]

常见问题:
1。各种编译问题
请确定你已经安装:
visual studio 6, Active Perl, Series 60 SDK
建议VC, Series 60, 还有你以后写的代码都放到同一个分区下, 可以省去设置上的一些麻烦。

Symbian OS 开发初级手册 (2)基本数据类型

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.

类型       描述
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 局部变量没有固定的规范

另外还用函数的命名, 但是要讲过leave的概念后才可以理解,所以这里先不介绍。
 
Symbian系统是以Nokai为首的各手机厂商合伙开发的一个操作系统,主要用于高端的智能手机。其开发语言为C++,可以使用Microsoft Visual C++ 6.0作为集成化的开发环境,看来虽然Symbian的目标是跟微软的SmartPhone较劲,在采取的手段和方法上却也是不拘一格,微软更是暗暗叫 苦,谁让当时vc6设计的这么开放,结果被敌人拿去做武器了。本文主要针对的是Symbian开发入门,所以应该是非常简单的事,因为毕竟Symbian 的开发语言是C++,并不会因为是用于手机的操作系统就复杂了多少,就象很多人一直挂在嘴边的J2ME也毕竟是Java语言,并不会因为用在手机上就高深 了多少一样。

    因为是用于手机的操作系统,所以我们研究Symbian的话,研究Nokia的60系列平台是一个很不错的选择,Nokia根据手机的屏幕大小和价格高低 把手机分成了多个系列,60系列目前有两款手机:7650和3650(很久以前) 。60系列采用Symbian os 6.1,然后又根据手机屏幕的特点对UI做了一些修改,这个被修改了的Symbian就被称为Nokia的60系列平台。所以接下来的内容对7650同样 有用。

    入门的第一步就是要下载S60的SDK,可以从Nokia的开发论坛上下载: http://www.asia.forum.nokia.com/chinese/sch/main/series60.html。   

    看Nokia网站上最新的是1.0,不过下面又有个0.9中文版,所以自然要下载这个0.9版了。100多兆吧,不想下的话,可以跟Nokia要光盘,估 计他们应该很高兴给。这个0.9中文版的模拟器是中文版的,而且有支持GBK和UNICODE转换的类,不知道1.0的英文版有没有。
    下载完了就是安装,选一个目录装就是了,不过最好装在C盘上。可能是考虑到Windows平台和Unix平台都能用的缘故,这套SDK在处理盘符和目录时 比较弱智,我当时SDK装到C盘,自己的程序放到D盘用vc6生成新项目就有问题,经观察是盘符的问题。所以保险起见的话,最好装在C盘,有兴趣的可以替 Nokia测试一下。另外,还需要Java的运行库和Perl,SDK里也都带了,不过他自带的Perl在我的XP下装有问题,我下载了一个最新的 ActivePerl才最终算是安装完毕。从SDK的安装来看,这帮搞手机的搞软件好像确实不太专业,呵呵。
    刚才说了,我的Symbian安装到了C盘,在C盘的Symbian目录下,有一个6.1的目录,6.1目录下有两个目录:Series60和 Shared。还好,从名字上能看出大体的意思。请一定注意Series60目录下的Epoc32/BUILD目录,因为这个目录以后要反复的用到。
    接下来的任务就是要编译一下HelloWorld,然后再运行一下看看了。首先得确认你的系统装VC6了(最好能装sp3以上,否则将来用到vc6时会报 警),而且得把C:/Program Files/Microsoft Visual Studio/VC98/Bin放到你的PATH里,主要是用nmake.exe。所以如果你有nmake的话,不装vc6也可以看 helloworld。找到helloword例子的目录,在我这里是C:/Symbian/6.1/Series60/Series60Ex/ HelloWorld/groupSymbian里,一个Project通常是按inc,src,group等目录组织,group目录里通常放的是项目 文件,所以编译时要先到这里。用命令提示符模式进入刚才说的那个目录下,然后执行 bldmake bldfiles这个命令会在group目录下生成一个abld.bat的批处理文件,并且会在C:/Symbian/6.1/Series60/ Epoc32/BUILD下生成C:/Symbian/6.1/Series60/Epoc32/BUILD/SYMBIAN/6.1/SERIES60 /SERIES60EX/HELLOWORLD/GROUP这个深的一个目录,并在最底层目录下生成一堆.make文件。(实在理解不了为什么要这么搞? 难道因为他们是生产手机的?)虽然它生成了这么多东西,但是我们不要管,继续输入abld build wins udeb这个命令会编译我们的程序,最后在 C:/Symbian/6.1/Series60/Epoc32/Release/wins/UDEB目录下生成我们的helloworld,然后我们可 以从开始菜单里运行模拟器的debug版,打开other目录就可以运行helloworld了。
    如果要在VC6里编译和运行HelloWorld,在运行完bldmake bldfiles后,运行abld makefile vc6,则会生成vc6的dsw文件,位置在 C:/Symbian/6.1/Series60/Epoc32/BUILD/SYMBIAN/6.1/SERIES60/SERIES60EX/HELLOWORLD/GROUP/HELLOWORLD/WINS
    看Symbian把这点事搞得这么麻烦,也真是不容易。
    如果要直接在vc6里创建新项目的话,要把 C:/Symbian/6.1/Series60/Series60Tools目录下的文件拷贝到vc6的模板目录下才可以。
    折腾到这里,可能得花2个多小时吧,接下的时间看看文档了。
    先看看HelloWorld的帮助文档,理解一下Symbian程序的体系结构。Symbian程序也是按照VC的文档视图结构来组织程序的,有 Application类CAknApplication,有Document类CAknDocument,有Frame类CAknAppUi,有视图类 CCoeControl等,跟vc的结构好像是差不多的,但感觉上它的Document类好像是做样子的,我还没看到这一块。关于这些类之间的调用关系, 在HelloWorld的文档里有个顺序图非常好,一看便知。
    在看Symbian的代码时,感觉最不适应的可能就是经常看到PushL和Pop函数,还有就是很多的函数都有L或LC的后缀。其实这是Symbian的 例外处理机制。比如说我们定义了一个指针,给它分配了空间,可是在使用它的时候程序突然间出现了致命错误中止了,那这个指针占用的地址空间我们肯定是收不 回来了,在PC上编程这一点可能问题不大,内存那么多,而且用不了多长时间就重启动了,但是Symbian的设计者可能认为这在手机上是不行的,所以对这 一点做了很多的设计。

    Symbian有一个Clean up stack,在使用指针时,用PushL把指针压入栈中,使用完后在用Pop弹出栈,如果在中间调用可能导致崩溃的函数时果真出现了问题,那么Clean up stack可以通过调用该指针的析构函数回收占用的空间。这些可能导致崩溃的函数在Symbian里被称为可能Leave的函数,所以就在这些函数的尾部 加了一个L。而加LC后缀的函数表明该函数已经在内部把指针用PushL压入clean up stack了,调用时无需再用PushL,直接调用完用Pop既可。Clean up stack还提供了一个PopAndDestroy函数,就是弹出栈后再销毁指针。顺便提一句,正式因为有了Clean up stack机制,所以Symbian在有些地方看起来跟VC的程序不太一样,比如说很多类的构造函数都不用,用NewL或NewLC构造,分配地址时的操 作符new()也变成了new(ELeave)。上述内容可以看一下Symbian编程基础中的内存管理一节。
    Symbian自己定义了一堆的数据类型,如果不想找麻烦的话,还是乖乖的用这些类型的好。简单说一下,整型有TInt和TUint,其中又分为8位的, 16位的和32位的,如TInt8,TInt16,TInt32;文本类型是TText,又细分为TText8和TText16,但内部都是 Unicode的,所以实际上内部引用应该都是TText16;bool型是TBool,对应的值有ETrue和EFalse;浮点型是TReal,但又 分为TReal32和TReal64;还有一个引用类型TRefByvalue,是以模板类的形式提供的。
    因为Symbian是冲着更面向对象设计的,所以在我们常见的字符串这块变化比较大,在Symbian里叫descriptor。最底层的是两个抽象类 TDesC和TDes,实际上TDes也是继承的TDesC,TDesC中的C字母是常量constant的意思。即带C字母结束的都是定义的常量,是不 可以修改的,而不带C的都有一个最大长度的限制,是可以修改的,下面也是同样的道理。指针描述符是TPtrC和TPtr,类似于C++中的char *;缓冲区描述符(Buffer descriptor)是TBufC和TBuf,类似于char [];堆描述符是HBufC,类似于(char *)malloc(length+1)的用法。具体用时,上述的类型又分为8位的和16位的。举个例子:
    TBuf<64> buf;
    CEikonEnv::Static()->ReadResource( buf, R_EXAMPLE_VIEW_TITLE );
    先定义了一个最大长度是64的缓冲区,然后读入名为R_EXAMPLE_VIEW_TITLE的资源。
    再例如:
TText8 *str = (TText8*)"示范窗口标题";
TPtrC8 source( str );
iInfoText = HBufC::NewL( source.Length() );
TPtr16 ptr = iInfoText->Des();
    定义一个8位的字符串str,然后构造一个指针常量source,根据source长度再定义一个16位的指针,下一步我这里没写,但明显着应该是把gbk的转换为unicode了。
    Symbian的资源文件一般是以rss为扩展名的,没有专门的资源文件编辑器,用户必须用记事本打开rss文件手工编写rss文件。这个都有一定的规则 和方法,参考例子不难编写自己的资源文件。需要注意的一点是,如果资源文件里包含中文,那么必须把文件另存为utf-8格式的才可。
    入门相对来说是比较简单的,但精通就需要大量的实践了。
    早就想写一篇这样的文章了,但一直不知从何写起,本文主要内容转自赛迪网的一篇文章,因为看到一些机友对3650的深一步研究有兴趣,所以转了这篇文章, 算是节省一点我的时间吧。需要说明的是:这只是一个简单的入门介绍,对于用C++编程的朋友来说应该算不得什么。对于初学者来说,C++功能非常强大,但 也相当复杂,过程是非常枯燥的,所以还是需要耐性和时间的。

不错的初级入门文章,至少对开发Symbian的c++程序有些初步的认识。剩下的就靠我们自己了!
感谢 uljvge

有兴趣的朋友可以加我msn:wangweixing2003@hotmail.com,一块学习!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值