免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 941 | 回复: 0
打印 上一主题 下一主题

Symbian开发入门 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-02-04 10:00 |只看该作者 |倒序浏览

symbian是一个操作系统,是以nokai为首的各手机厂商合伙攒的一个操作系统,主要用于高端的智能手机。其开发语言为c++,可以使用microsoft visual c++ 6.0作为集成化的开发环境,看来虽然symbian的目标是跟微软的smartphone较劲,在采取的手段和方法上却也是不拘一格,微软更是暗暗叫苦,谁让当时vc6设计的这么开放,结果被敌人拿去做武器了。
本文只是为了symbian的开发入门,所以应该是非常简单的事,因为毕竟symbian的开发语言是c++,并不会因为是用于手机的操作系统就复杂了多少,就象很多人一直挂在嘴边的j2me也毕竟是java语言,并不会因为用在手机上就高深了多少一样,只能是更简单。5小时是我从对symbian一无所知到完成本文化在symbian上的所有时间。
因为是用于手机的操作系统,所以我们研究symbian的话,先选定一款手机再说。nokai的60系列平台是一个很不错的开始,nokai根据手机的屏幕大小和价格高低把手机分成了多个系列,60系列目前有两款手机:7650和3650。60系列采用symbian os 6.1,然后又根据手机屏幕的特点对ui做了一些修改,这个被修改了的symbian就被称为nokia的60系列平台。
所以入门的第一步就是要下载s60的sdk,可以从nokai的开发论坛上下载:
http://www.asia.forum.nokia.com/chinese/sch/main/series60.html
。看nokai网站上最新的是1.0,不过下面又有个0.9中文版,所以自然要下载这个0.9版了。100多兆吧,不想下的话,可以跟nokai要光盘,估计他们应该很高兴给吧。这个0.9中文版的模拟器是中文版的,而且有支持gbk和unicode转换的类,不知道1.0的英文版有没有。
下载完了自然就是安装,选一个目录装就是了,不过最好装在c盘上,可能是考虑到windows平台和unix平台都能用的缘故,这套sdk在处理盘符和目录时比较弱智,我当时sdk装到c盘,自己的程序放到d盘用vc6生成新项目就有问题,经观察是盘符的问题。所以保险起见的话,最好装在c盘,有兴趣的可以替nokai测试一下。另外,还需要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\group。symbian里,一个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 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格式的才可。

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/11783/showart_71663.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP