Symbian OS C++学习
原文网址:http://www.hotpim.com/blog/myIndex.jsp?a=bc&b=2130&u=387
Symbian OS C++学习
Symbian OS C++学习
学习symbian手机开发快两个星期了,个人觉得学习symbian入门确实挺难的,在学习symbian开发的过程中也走了很多弯路,现将自己这段时间学习symbian的过程写下来,以期望能给将来打算学习symbian开发的同事带来一定的帮助;
俗话说,弓欲善其事,必先利其器,要学习symbian手机开发,当然首先需要安装symbian的开发环境(这里我们使用symbian sdk 2.0以及VC6 IDE),这里就不详细介绍,读者参考笔者写的symbian安装指导,按照顺序安装好symbian,然后检查一下看看能不能用,检查方法是拷贝安装目录下的helloworld(C:\Symbian\7.0s\Series60_v20\Examples\helloworld)示例到系统根目录(c盘根目录),然后进入DOS命令界面,进入helloworld当前目录,输入bldmake bldfiles(如下图1)回车,如果安装好的symbian开发环境不能用,则会会提示错误,正常情况不提示(如下图1);
图1
小提示:不知道是什么原因,笔者在学习symbian的过程中发现,如果我们需要编译的项目文件不放在c盘下的话,输入bldmake bldfiles提示环境变量RPOCROOT有问题,以及输入其他编译命令都会出问题(此外,在VC中新建项目,如果不放在c盘也会有问题),具体原因笔者也还没有搞清楚(也许symbian硬性规定吧),所以笔者建议将项目放在c盘下,这样就可以顺利我们的开发了;
好了,现在开发环境已经建立好了,接下来介绍一下如何学习symbian OS C++了;笔者建议,初学者不要买什么参考书,直接看SDK中自带的文档就可以,SDK文档(直接进入C:\Symbian\7.0s\Series60_v20\Series60Doc这个目录看)有详细的symbian介绍,当然,这些文档都是英文的,如果英语不是很好的话,学习起来确实有点困难,不过笔者认为不要怕,大不了开着金山词霸,然后硬着头皮看,多花点时间慢慢看就好了,既可以学习symbian又可以提高英语,一举两得;
1、阅读SDK文档
笔者觉得先看coding idioms for symbian os.pdf,这个文档主要是讲述symbian开发的一些通俗约定,先看这个的原因是,当你熟悉了这些约定后,接下来你看示例或者是其他文档,不会觉得莫名其妙,因为Symbian C ++与我们平常PC平台的C++编程规范很不一样;笔者在学习过程中走了弯路,开始学习时拿到了一本叫做“Symbian OS C++手机应用开发”的书,刚开始看的迷迷糊糊,不知所云,原因就是不了解symbian的编程约定,所以看到很多名字和代码都不知道是怎么回事;
然后,再看看series 60 ui style guide.pdf,这个文档主要是介绍series 60开发的一些UI基本格局以及一些专业术语约定,当然,如果你以前做过手机开发,也许可以不看,因为目前大部分手机的界面格局基本都差不多;
接着再看看getting started.pdf、guide for application developers on document handler.pdf 和appwizard guide.pdf这几个文档,前两个文档主要让你对symbian开发有感性认识,掌握一些基本知识;最后一个是教你怎么使用VC IDE建立一个新的symbian项目;
有了上面的基本知识后,我们再看application framework handbook.pdf这个文档,这个文档挺重要的,主要介绍symbian软件程序的开发框架(专业讲是软件的设计模式),看完这个文档,读者应该对symbian软件开发框架有个整体认识(真正开发还需要很多其他知识),知道怎样建立symbian应用程序,编写symbian程序具体怎么个步骤应心中有数;
说到这里,笔者顺便提一下symbian使用的设计模式,它采用MVC模式,MVC字面意思是Model、View、Control,Model主要负责数据,View主要用于显示数据以及屏幕的一些处理,Control主要是负责处理用户交互以及对数据的访问控制;MVC很象微软的文档/视图结构(有微软MFC编程经验的人应该很清楚了),采用MVC的目的主要是为了文件的结构清晰,软件开发的复杂度明显降低;
看完上述文档后,应该对symbian有了个基本了解,开发的整体框架也知道,接下来就可以看一下深入的开发资料了,至于顺序就没什么关系,自己看着办,把其他资料看完就可以;
2、示例分析
想要学会symbian开发,光看资料是没用的,还得多看示例代码,并自己多动手写才能真正掌握,接下来我们来分析一下helloworld这个程序:
helloworld.mmp这个文件是项目工程文件,指出本工程包含信息有:目标文件名,目标问题类型,UID(应用程序标识号,目标文件、资源文件、源文件、头文件、库文件的位置;
HelloWorld.rss资源文件,定义了该程序用到的资源(包括字符资源,菜单等资源);
Helloworld.uid.cpp,定义程序标识号;
Helloworld_main.cpp,程序入口点所在文件,该文件中包含两个函数TInt E32Dll(TDllReason),CApaApplication* NewApplication(),前一个没什么意义,后一个是用于建立程序示例,算是整个程序的入口点,整个程序由它来建立第一个我们的应用对象实例,这里建立CExampleApplication对象的一个实例;
Helloworld_application.cpp,CExampleApplication类对象的具体实现文件,包含两个函数CreateDocumentL(),AppDllUid(),前一个用于建立文档对象实例,后一个取得程序标识号;
Helloworld_document.cpp,CExampleDocument类对象的实现文件,包含CExampleDocument(CEikApplication& aApp),CreateAppUiL()两个成员函数,前一个是构造函数,后一个用于创建应用程序接口对象;
Helloworld_appui.cpp,CexampleAppUi类对象的实现文件,HandleCommandL(TInt aCommand)命令处理函数,~CExampleAppUi()析构函数,ConstructL()第二阶段构造函数,用于创建应用程序视图;
Helloworld_appview.cpp,该文件中,CExampleAppView()默认构造函数,ConstructL(const TRect& aRect)第二阶段构造函数,建立具体的视图界面,~CExampleAppView()析构函数,NewL(const TRect& aRect)对象示例构建函数,Draw(const TRect& /*aRect*/) 视图窗口绘制函数,用于绘制窗口;
整个程序的建立过程就是:系统通过NewApplication建立CExampleApplication对象实例,然后由其建立CExampleDocument文档对象,再由CExampleDocument建立CExampleAppUi对象,最后由CExampleAppUi建立CExampleAppView对象;
从MVC的角度来讲,CExampleDocument相对于M,CExampleAppUi对应于C,CExampleAppView对应于V;整个文件因此包含四部分,也就是四个类,应用程序类、文档类、应用程序UI类以及应用程序视图类;
3、应用程序的编译
应用程序的编译方式包括两种:命令行表演和图形IDE中编译,我个人习惯命令行编译;
首先,进入helloworld编译配置文件所在目录(一般就是bld.inf文件所在目录。这里就是helloworld当前目录),然后输入bldmake bldfiles(如图1),接着输入abld build wins udeb(这里解释一下wins和udeb两个参数,前一个参数指定生成是针对仿真器、使用的是VC编译器,后一个参数表示使用unicode调试生成;这样编译就完成了;
如果还想让该项目在VC IDE中打开,这样用命令abld makefile vc6将来VC工程文件;
4、运行程序
要运行刚才编译生成的程序,可以直接在命令行输入epoc.exe也可以在VC IDE中直接点击运行(需要选择epoc来运行,在C:\Symbian\7.0s\Series60_v20\Epoc32\release\wins\udeb中),这样启动仿真器后就可以在仿真器上运行编译好的程序;
以上只是编译成能够在仿真器上运行的调试程序,真正的程序要运行在真机上了,则编译参数需要改一改,并制作成安装包,安装到真机上运行;
总结,编译命令
bldmake bldfiles :生成项目的生成文件和批处理文件abld.bat;
abld build <platform> <buildtype> :编译命令,<buildtype>参数若为udeb,则生成调试版,为urel则为发布版,为all,则同时生成两种;
<platform> 依赖于目标处理器和所用编译器两方面,若是仿真器下,则有winsb(针对Borland c++)、winscw(Metrowerks)、wins(Microsoft)
使用完全相同的过程,可以为实际的目标手机运行命令生成,只是<platform>参数不一样,可以是ARM4 (为ARMv4指令集编译),ARMI(为ARMv4T指令集的THUMB模式子集编译),THUMB (armvT指令集的ARM模式子集编译);
如要使用VC6 IDE则进入包含abld.bat文件的目录下,在命令行输入abld makefile vc6