Symbian是以Nokai为首
![](/icons/34976de.gif)
各手机厂商合伙开发
![](/icons/34976de.gif)
![](/icons/34976yi.gif)
个操作系统
![](/icons/34976dou.gif)
主要用于高端
![](/icons/34976de.gif)
智能手机
![](/icons/34976dou2.gif)
其开发语言为C
![](/icons/34976jiajia.gif)
![](/icons/34976dou.gif)
可以使用Microsoft Visual C
![](/icons/34976jiajia.gif)
6.0作为集成化
![](/icons/34976de.gif)
开发环境
![](/icons/34976dou.gif)
看来虽然Symbian
![](/icons/34976de.gif)
目标是跟微软
![](/icons/34976de.gif)
SmartPhone较劲
![](/icons/34976dou.gif)
在采取
![](/icons/34976de.gif)
手段和方法上却也是不拘
![](/icons/34976yi.gif)
格
![](/icons/34976dou.gif)
微软更是暗暗叫苦
![](/icons/34976dou.gif)
谁让当时vc6设计
![](/icons/34976de.gif)
这么开放
![](/icons/34976dou.gif)
结果被敌人拿去做武器了
![](/icons/34976dou2.gif)
本文主要针对
![](/icons/34976de.gif)
是Symbian开发入门
![](/icons/34976dou.gif)
所以应该是非常简单
![](/icons/34976de.gif)
事
![](/icons/34976dou.gif)
![](/icons/34976yinwei.gif)
毕竟Symbian
![](/icons/34976de.gif)
开发语言是C
![](/icons/34976jiajia.gif)
![](/icons/34976dou.gif)
并不会
![](/icons/34976yinwei.gif)
是用于手机
![](/icons/34976de.gif)
操作系统就复杂了多少
![](/icons/34976dou.gif)
就象很多人
![](/icons/34976yi.gif)
直挂在嘴边
![](/icons/34976de.gif)
J2ME也毕竟是Java语言
![](/icons/34976dou.gif)
并不会
![](/icons/34976yinwei.gif)
用在手机上就高深了多少
![](/icons/34976yi.gif)
样
![](/icons/34976dou2.gif)
5小时是我从对Symbian
![](/icons/34976yi.gif)
无所知到完成本文花在Symbian上
![](/icons/34976de.gif)
所有时间
![](/icons/34976yinwei.gif)
是用于手机
![](/icons/34976de.gif)
操作系统
![](/icons/34976dou.gif)
所以我们研究Symbian
![](/icons/34976de.gif)
话
![](/icons/34976dou.gif)
先选定
![](/icons/34976yi.gif)
款手机再说
![](/icons/34976dou2.gif)
Nokia
![](/icons/34976de.gif)
60系列平台是
![](/icons/34976yi.gif)
个很不错
![](/icons/34976de.gif)
选择
![](/icons/34976dou.gif)
Nokia根据手�钠聊淮笮『图鄹窀叩桶咽只�殖闪硕喔鱿盗校?0系列目前有两款手机:7650和3650
![](/icons/34976dou2.gif)
60系列采用Symbian os 6.1
![](/icons/34976dou.gif)
然后又根据手机屏幕
![](/icons/34976de.gif)
特点对UI做了
![](/icons/34976yi.gif)
些修改
![](/icons/34976dou.gif)
这个被修改了
![](/icons/34976de.gif)
Symbian就被称为Nokia
![](/icons/34976de.gif)
60系列平台
所以入门
![](/icons/34976de.gif)
第
![](/icons/34976yi.gif)
步就是要下载S60
![](/icons/34976de.gif)
SDK
![](/icons/34976dou.gif)
可以从Nokia
![](/icons/34976de.gif)
开发论坛上下载:http://www.asia.forum.nokia.com/chinese/sch/
![](/icons/34976main.gif)
/series60.html
![](/icons/34976dou2.gif)
看Nokia网站上最新
![](/icons/34976de.gif)
是1.0
![](/icons/34976dou.gif)
不过下面又有个0.9中文版
![](/icons/34976dou.gif)
所以自然要下载这个0.9版了
![](/icons/34976dou2.gif)
100多兆吧
![](/icons/34976dou.gif)
不想下
![](/icons/34976de.gif)
话
![](/icons/34976dou.gif)
可以跟Nokia要光盘
![](/icons/34976dou.gif)
估计他们应该很高兴给
![](/icons/34976dou2.gif)
这个0.9中文版
![](/icons/34976de.gif)
模拟器是中文版
![](/icons/34976de.gif)
![](/icons/34976dou.gif)
而且有支持GBK和UNICODE转换
![](/icons/34976de.gif)
类
![](/icons/34976dou.gif)
不知道1.0
![](/icons/34976de.gif)
英文版有没有
下载完了就是安装
![](/icons/34976dou.gif)
选
![](/icons/34976yi.gif)
个目录装就是了
![](/icons/34976dou.gif)
不过最好装在C盘上
![](/icons/34976dou2.gif)
可能是考虑到Windows平台和Unix平台都能用
![](/icons/34976de.gif)
缘故
![](/icons/34976dou.gif)
这套SDK在处理盘符和目录时比较弱智
![](/icons/34976dou.gif)
我当时SDK装到C盘
![](/icons/34976dou.gif)
自己
![](/icons/34976de.gif)
![](/icons/34976chengxu.gif)
放到D盘用vc6生成新项目就有问题
![](/icons/34976dou.gif)
经观察是盘符
![](/icons/34976de.gif)
问题
![](/icons/34976dou2.gif)
所以保险起见
![](/icons/34976de.gif)
话
![](/icons/34976dou.gif)
最好装在C盘
![](/icons/34976dou.gif)
有兴趣
![](/icons/34976de.gif)
可以替Nokia测试
![](/icons/34976yi.gif)
下
![](/icons/34976dou2.gif)
另外
![](/icons/34976dou.gif)
还需要Java
![](/icons/34976de.gif)
运行库和Perl
![](/icons/34976dou.gif)
SDK里也都带了
![](/icons/34976dou.gif)
不过他自带
![](/icons/34976de.gif)
Perl在我
![](/icons/34976de.gif)
XP下装有问题
![](/icons/34976dou.gif)
我下载了
![](/icons/34976yi.gif)
个最新
![](/icons/34976de.gif)
ActivePerl才最终算是安装完毕
![](/icons/34976dou2.gif)
从SDK
![](/icons/34976de.gif)
安装来看
![](/icons/34976dou.gif)
这帮搞手机
![](/icons/34976de.gif)
搞软件好像确实不太专业
刚才说了
![](/icons/34976dou.gif)
我
![](/icons/34976de.gif)
Symbian安装到了C盘
![](/icons/34976dou.gif)
在C盘
![](/icons/34976de.gif)
Symbian目录下
![](/icons/34976dou.gif)
有
![](/icons/34976yi.gif)
个6.1
![](/icons/34976de.gif)
目录
![](/icons/34976dou.gif)
6.1目录下有两个目录:Series60和Shared
![](/icons/34976dou2.gif)
还好
![](/icons/34976dou.gif)
从名字上能看出大体
![](/icons/34976de.gif)
意思
![](/icons/34976dou2.gif)
请
![](/icons/34976yi.gif)
定注意Series60目录下
![](/icons/34976de.gif)
Epoc32\BUILD目录
![](/icons/34976dou.gif)
![](/icons/34976yinwei.gif)
这个目录以后要反复
![](/icons/34976de.gif)
用到
接下来
![](/icons/34976de.gif)
任务就是要编译
![](/icons/34976yi.gif)
下HelloWorld
![](/icons/34976dou.gif)
然后再运行
![](/icons/34976yi.gif)
下看看了
![](/icons/34976dou2.gif)
首先得确认你
![](/icons/34976de.gif)
系统装VC6了(最好能装sp3以上
![](/icons/34976dou.gif)
否则将来用到vc6时会报警)
![](/icons/34976dou.gif)
而且得把 C:\Program Files\Microsoft Visual Studio\VC98\Bin
放到你
![](/icons/34976de.gif)
PATH里
![](/icons/34976dou.gif)
主要是用nmake.exe
![](/icons/34976dou2.gif)
所以如果你有nmake
![](/icons/34976de.gif)
话
![](/icons/34976dou.gif)
不装vc6也可以看helloworld
找到helloword例子
![](/icons/34976de.gif)
目录
![](/icons/34976dou.gif)
在我这里是 C:\Symbian\6.1\Series60\Series60Ex\HelloWorld\group
Symbian里
![](/icons/34976dou.gif)
![](/icons/34976yi.gif)
个Project通常是按inc,src,group等目录组织
![](/icons/34976dou.gif)
group目录里通常放
![](/icons/34976de.gif)
是项目文件
![](/icons/34976dou.gif)
所以编译时要先到这里
![](/icons/34976dou2.gif)
用命令提示符模式进入刚才说
![](/icons/34976de.gif)
那个目录下
![](/icons/34976dou.gif)
然后执行 bldmake bldfiles
这个命令会在group目录下生成
![](/icons/34976yi.gif)
个abld.bat
![](/icons/34976de.gif)
批处理文件
![](/icons/34976dou.gif)
并且会在C:\Symbian\6.1\Series60\Epoc32\BUILD下生成C:\Symbian\6.1\Series60\Epoc32\BUILD\SYMBIAN\6.1\SERIES60\SERIES60EX\HELLOWORLD\GROUP这个深
![](/icons/34976de.gif)
![](/icons/34976yi.gif)
个目录
![](/icons/34976dou.gif)
并在最底层目录下生成
![](/icons/34976yi.gif)
堆.make文件
![](/icons/34976dou2.gif)
(实在理解不了为什么要这么搞?
![](/icons/34976yinwei.gif)
他们是生产手机
![](/icons/34976de.gif)
?)
虽然它生成了这么多东西
![](/icons/34976dou.gif)
但是我们不要管
![](/icons/34976dou.gif)
继续输入 abld build wins udeb
这个命令会编译我们
![](/icons/34976de.gif)
![](/icons/34976chengxu.gif)
![](/icons/34976dou.gif)
最后在 C:\Symbian\6.1\Series60\Epoc32\Release\wins\UDEB
目录下生成我们
![](/icons/34976de.gif)
helloworld
![](/icons/34976dou.gif)
然后我们可以从开始菜单里运行模拟器
![](/icons/34976de.gif)
debug版
![](/icons/34976dou.gif)
打开other目录就可以运行helloworld了
如果要在VC6里编译和运行HelloWorld
![](/icons/34976dou.gif)
在运行完bldmake bldfiles后
![](/icons/34976dou.gif)
运行abld makefile vc6
![](/icons/34976dou.gif)
则会生成vc6
![](/icons/34976de.gif)
dsw文件
![](/icons/34976dou.gif)
位置在 C:\Symbian\6.1\Series60\Epoc32\BUILD\SYMBIAN\6.1\SERIES60 \SERIES60EX\HELLOWORLD\GROUP\HELLOWORLD\WINS
看Symbian把这点事搞得这么麻烦
![](/icons/34976dou.gif)
也真是不容易
如果要直接在vc6里创建新项目
![](/icons/34976de.gif)
话
![](/icons/34976dou.gif)
要把 C:\Symbian\6.1\Series60\Series60Tools
目录下
![](/icons/34976de.gif)
文件拷贝到vc6
![](/icons/34976de.gif)
模板目录下才可以
折腾到这里
![](/icons/34976dou.gif)
可能得花2个多小时吧
![](/icons/34976dou.gif)
剩下
![](/icons/34976de.gif)
两个多小时得看看文档了
先看看HelloWorld
![](/icons/34976de.gif)
帮助文档
![](/icons/34976dou.gif)
理解
![](/icons/34976yi.gif)
下Symbian
![](/icons/34976chengxu.gif)
![](/icons/34976de.gif)
体系结构
![](/icons/34976dou2.gif)
Symbian
![](/icons/34976chengxu.gif)
也是按照VC
![](/icons/34976de.gif)
文档视图结构来组织
![](/icons/34976chengxu.gif)
![](/icons/34976de.gif)
![](/icons/34976dou.gif)
有Application类CAknApplication
![](/icons/34976dou.gif)
有document.CAkndocument.有Frame类CAknAppUi
![](/icons/34976dou.gif)
有视图类CCoeControl等
![](/icons/34976dou.gif)
跟vc
![](/icons/34976de.gif)
结构好像是差不多
![](/icons/34976de.gif)
![](/icons/34976dou.gif)
但感觉上它
![](/icons/34976de.gif)
document.好像是做样子
![](/icons/34976de.gif)
![](/icons/34976dou.gif)
我还没看到这
![](/icons/34976yi.gif)
块
![](/icons/34976dou2.gif)
关于这些类之间
![](/icons/34976de.gif)
![](/icons/34976diaoyong.gif)
关系
![](/icons/34976dou.gif)
在HelloWorld
![](/icons/34976de.gif)
文档里有个顺序图非常好
![](/icons/34976dou.gif)
![](/icons/34976yi.gif)
看便知
在看Symbian
![](/icons/34976de.gif)
代码时
![](/icons/34976dou.gif)
感觉最不适应
![](/icons/34976de.gif)
可能就是经常看到PushL和Pop
![](/icons/34976hanshu.gif)
![](/icons/34976dou.gif)
还有就是很多
![](/icons/34976de.gif)
![](/icons/34976hanshu.gif)
都有L或LC
![](/icons/34976de.gif)
后缀
![](/icons/34976dou2.gif)
其实这是Symbian
![](/icons/34976de.gif)
例外处理机制
![](/icons/34976dou2.gif)
比如说我们定义了
![](/icons/34976yi.gif)
个指针
![](/icons/34976dou.gif)
给它分配了空间
![](/icons/34976dou.gif)
可是在使用它
![](/icons/34976de.gif)
时候
![](/icons/34976chengxu.gif)
突然间出现了致命
![](/icons/34976cuowu.gif)
中止了
![](/icons/34976dou.gif)
那这个指针占用
![](/icons/34976de.gif)
地址空间我们肯定是收不回来了
![](/icons/34976dou.gif)
在PC上编程这
![](/icons/34976yi.gif)
点可能问题不大
![](/icons/34976dou.gif)
内存那么多
![](/icons/34976dou.gif)
而且用不了多长时间就重启动了
![](/icons/34976dou.gif)
但是Symbian
![](/icons/34976de.gif)
设计者可能认为这在手机上是不行
![](/icons/34976de.gif)
![](/icons/34976dou.gif)
所以对这
![](/icons/34976yi.gif)
点做了很多
![](/icons/34976de.gif)
设计
![](/icons/34976dou2.gif)
Symbian有
![](/icons/34976yi.gif)
个Clean up stack
![](/icons/34976dou.gif)
在使用指针时
![](/icons/34976dou.gif)
用PushL把指针压入栈中
![](/icons/34976dou.gif)
使用完后在用Pop弹出栈
![](/icons/34976dou.gif)
如果在中间
![](/icons/34976diaoyong.gif)
可能导致崩溃
![](/icons/34976de.gif)
![](/icons/34976hanshu.gif)
时果真出现了问题
![](/icons/34976dou.gif)
那么Clean up stack可以通过
![](/icons/34976diaoyong.gif)
该指针
![](/icons/34976de.gif)
析构
![](/icons/34976hanshu.gif)
回收占用
![](/icons/34976de.gif)
空间
![](/icons/34976dou2.gif)
这些可能导致崩溃
![](/icons/34976de.gif)
![](/icons/34976hanshu.gif)
在Symbian里被称为可能Leave
![](/icons/34976de.gif)
![](/icons/34976hanshu.gif)
![](/icons/34976dou.gif)
所以就在这些
![](/icons/34976hanshu.gif)
![](/icons/34976de.gif)
尾部加了
![](/icons/34976yi.gif)
个L
![](/icons/34976dou2.gif)
而加LC后缀
![](/icons/34976de.gif)
![](/icons/34976hanshu.gif)
表明该
![](/icons/34976hanshu.gif)
已经在内部把指针用PushL压入clean up stack了
![](/icons/34976dou.gif)
![](/icons/34976diaoyong.gif)
时无需再用PushL
![](/icons/34976dou.gif)
直接
![](/icons/34976diaoyong.gif)
完用Pop既可
![](/icons/34976dou2.gif)
Clean up stack还提供了
![](/icons/34976yi.gif)
个PopAndDestroy
![](/icons/34976hanshu.gif)
![](/icons/34976dou.gif)
就是弹出栈后再销毁指针
![](/icons/34976dou2.gif)
顺便提
![](/icons/34976yi.gif)
句
![](/icons/34976dou.gif)
正式
![](/icons/34976yinwei.gif)
有了Clean up stack机制
![](/icons/34976dou.gif)
所以Symbian在有些地方看起来跟VC
![](/icons/34976de.gif)
![](/icons/34976chengxu.gif)
不太
![](/icons/34976yi.gif)
样
![](/icons/34976dou.gif)
比如说很多类
![](/icons/34976de.gif)
构造
![](/icons/34976hanshu.gif)
都不用
![](/icons/34976dou.gif)
用NewL或NewLC构造
![](/icons/34976dou.gif)
分配地址时
![](/icons/34976de.gif)
操作符
![](/icons/34976new.gif)
![](/icons/34976kh.gif)
也变成了
![](/icons/34976new.gif)
(ELeave)
![](/icons/34976dou2.gif)
上述内容可以看
![](/icons/34976yi.gif)
下Symbian编程基础中
![](/icons/34976de.gif)
内存管理
![](/icons/34976yi.gif)
节
Symbian自己定义了
![](/icons/34976yi.gif)
堆
![](/icons/34976de.gif)
数据类型
![](/icons/34976dou.gif)
如果不想找麻烦
![](/icons/34976de.gif)
话
![](/icons/34976dou.gif)
还是乖乖
![](/icons/34976de.gif)
用这些类型
![](/icons/34976de.gif)
好
![](/icons/34976dou2.gif)
简单说
![](/icons/34976yi.gif)
下
![](/icons/34976dou.gif)
整型有TInt和TU
![](/icons/34976int.gif)
,其中又分为8位
![](/icons/34976de.gif)
![](/icons/34976dou.gif)
16位
![](/icons/34976de.gif)
和32位
![](/icons/34976de.gif)
![](/icons/34976dou.gif)
如TInt8,TInt16,TInt32;文本类型是TText
![](/icons/34976dou.gif)
又细分为TText8和TText16
![](/icons/34976dou.gif)
但内部都是Unicode
![](/icons/34976de.gif)
![](/icons/34976dou.gif)
所以实际上内部引用应该都是TText16;bool型是TBool
![](/icons/34976dou.gif)
对应
![](/icons/34976de.gif)
值有ETrue和EFalse;浮点型是TReal
![](/icons/34976dou.gif)
但又分为TReal32和TReal64;还有
![](/icons/34976yi.gif)
个引用类型TRefByvalue<T>
![](/icons/34976dou.gif)
是以模板类
![](/icons/34976de.gif)
形式提供
![](/icons/34976de.gif)
![](/icons/34976yinwei.gif)
Symbian是冲着更面向对象设计
![](/icons/34976de.gif)
![](/icons/34976dou.gif)
所以在我们常见
![](/icons/34976de.gif)
![](/icons/34976zifu.gif)
串这块变化比较大
![](/icons/34976dou.gif)
在Symbian里叫descriptor
![](/icons/34976dou2.gif)
最底层
![](/icons/34976de.gif)
是两个抽象类TDesC和TDes,实际上TDes也是继承
![](/icons/34976de.gif)
TDesC
![](/icons/34976dou.gif)
TDesC中
![](/icons/34976de.gif)
C字母是常量constant
![](/icons/34976de.gif)
意思
![](/icons/34976dou2.gif)
即带C字母结束
![](/icons/34976de.gif)
都是定义
![](/icons/34976de.gif)
常量
![](/icons/34976dou.gif)
是不可以修改
![](/icons/34976de.gif)
![](/icons/34976dou.gif)
而不带C
![](/icons/34976de.gif)
都有
![](/icons/34976yi.gif)
个最大长度
![](/icons/34976de.gif)
限制
![](/icons/34976dou.gif)
是可以修改
![](/icons/34976de.gif)
![](/icons/34976dou.gif)
下面也是同样
![](/icons/34976de.gif)
道理
![](/icons/34976dou2.gif)
指针描述符是TPtrC和TPtr
![](/icons/34976dou.gif)
类似于C
![](/icons/34976jiajia.gif)
中
![](/icons/34976de.gif)
char *;缓冲区描述符(Buffer descriptor)是TBufC和TBuf
![](/icons/34976dou.gif)
类似于char
![](/icons/34976zhk2.gif)
;堆描述符是HBufC
![](/icons/34976dou.gif)
类似于(char *)malloc(length+1)
![](/icons/34976de.gif)
用法
![](/icons/34976dou2.gif)
具体用时
![](/icons/34976dou.gif)
上述
![](/icons/34976de.gif)
类型又分为8位
![](/icons/34976de.gif)
和16位
![](/icons/34976de.gif)
![](/icons/34976dou2.gif)
举个例子:
TBuf<64> buf;
CEikonEnv::Static
![](/icons/34976kh.gif)
->ReadResource( buf, R_EXAMPLE_VIEW_TITLE );
先定义了
![](/icons/34976yi.gif)
个最大长度是64
![](/icons/34976de.gif)
缓冲区
![](/icons/34976dou.gif)
然后读入名为R_EXAMPLE_VIEW_TITLE
![](/icons/34976de.gif)
资源
再例如:
TText8 *str = (TText8*)"示范窗口标题";
TPtrC8 source( str );
iInfoText = HBufC::NewL( source.Length
![](/icons/34976kh.gif)
);
TPtr16 ptr = iInfoText->Des
![](/icons/34976kh.gif)
;
定义
![](/icons/34976yi.gif)
个8位
![](/icons/34976de.gif)
![](/icons/34976zifu.gif)
串str
![](/icons/34976dou.gif)
然后构造
![](/icons/34976yi.gif)
个指针常量source
![](/icons/34976dou.gif)
根据source长度再定义
![](/icons/34976yi.gif)
个16位
![](/icons/34976de.gif)
指针
![](/icons/34976dou.gif)
下
![](/icons/34976yi.gif)
步我这里没写
![](/icons/34976dou.gif)
但明显着应该是把gbk
![](/icons/34976de.gif)
转换为unicode了
Symbian
![](/icons/34976de.gif)
资源文件
![](/icons/34976yi.gif)
般是以rss为扩展名
![](/icons/34976de.gif)
![](/icons/34976dou.gif)
没有专门
![](/icons/34976de.gif)
资源文件编辑器
![](/icons/34976dou.gif)
用户必须用记事本打开rss文件手工编写rss文件
![](/icons/34976dou2.gif)
这个都有
![](/icons/34976yi.gif)
定
![](/icons/34976de.gif)
规则和方法
![](/icons/34976dou.gif)
参考例子不难编写自己
![](/icons/34976de.gif)
资源文件
![](/icons/34976dou2.gif)
需要注意
![](/icons/34976de.gif)
![](/icons/34976yi.gif)
点是
![](/icons/34976dou.gif)
如果资源文件里包含中文
![](/icons/34976dou.gif)
那么必须把文件另存为utf-8格式
![](/icons/34976de.gif)
才可
入门相对来说是比较简单
![](/icons/34976de.gif)
![](/icons/34976dou.gif)
但精通就需要大量
![](/icons/34976de.gif)
实践了
延伸阅读
最新评论