2005年08月01日

Symbian 的历史

       说起Symbian我们必须提到PSION(宝意昂)公司和它的EPOC操作系统,Symbian正是由它们发展而来的。

 

       Psion公司于1980年创立,始人为David Potter.当时的Psion是欧洲领先的技术公司,一直致力于为数字产品开发和研究.同时Psion也是欧洲第一批主要的PDA厂商,其PDA产品在欧洲一直享有盛誉。至于EPOC则是Psion Software推出的操作系统,专门用于移动信息设备,包括掌上电脑."EPOC”这个词起源于世界将会进入“a new epoch of personal convenience”。EPOC是一个开放的操作系统,一开始的时候EPOC就加上了无线通信和一个外加应用程序的体系,因此在无线通信方面与其他操作系统相比具备先天的优势。同时,和微软的Windows CE一样,EPOC也是一套32位的操作系统,具备实时性、多任务的,多线程、低功耗,内存占用少等特点。我们熟悉的爱立信R380SC就是使用的基于EPOC的操作系统。

       1998年六月,为了在将来的智能移动终端领域取得先机和市场地位。Psion公司联合手机业界巨头,诺基亚、爱立信、摩托罗拉和组建了Symbian公司。该公司继承了Psion公司EPOC操作系统软件的授权,并且致力于为移动信息设备提供一个安全可*的操作系统和一个完整的软件及通讯器平台。作为一种开放式平台,任何人都可以为支持Symbian的设备开发软件。这意味着开发伙伴具有更多可供选择的应用,同时拥有更大的市场。为此symbian推出了白金合作计划吸引了包括ARM、Motorola SPSRealNetworks、TI德州仪器等大量的厂商加入。Symbian公司还大量参与WAP、WirelessJava和Bluetooth的制定工作,确保EPOC将完全支持市场的内容和服务需求模块化、可伸缩性、低能耗以及与StrongARM这类RISC芯片的兼容性。因此微软的Windos Mobile操作系统相比,Symbian在通信方面的优势得天独厚。

  

       现在的Symbian因为松下,西门子和三星的先后加入已经成为由Psion、诺基亚、索尼爱立信、摩托罗拉、松下、西门子、三星联合控股的公司。尽管后来摩托罗拉出售了在Symbian的股权,但在2004年第一季度,LG、Arima和联想成为最新取得Symbian授权协议的手机制造商,从而使得获得授权的厂商总数达到了18家,几乎囊括了全球所有重量级的手机制造商。

Symbian旗下的系列:珍珠、石英和水晶

       Symbian为其旗下种类的三种产品分别给予了诗意的命名,即Pearl(珍珠),Quartz(石英)和Crystal(水晶)。分别用于智能手机、笔式输入通讯器和键盘输入通讯器。每种系列都采用Symbian核心平台80%的代码。不同系列之间的区别主要在于用户接口(例如:笔式或键盘式输入)和屏幕大小。

       在三个系列中,Quartz和Crystal都被称作“通讯器”,惟有Pearl是“智能电话”。

       Quartz是EPOC操作系统中Palm size PC版本。支持系统的能力非常强大,使用者接口设计和操作方式比Palm OS操作系统及Pocket PC操作系统更具人性。基本上是把两个操作系统的优点集于一身。它的特色是 采用笔式输入,屏幕像素为320×240,彩色屏幕,以及图形用户接口的手机。摩托罗拉的三频GPRS/GSM通信器Accompli就属于Quartz系列.而Crystal则是EPOC操作系统中Hand Held PC版本,特色是具有软件和硬件输入键盘的无线信息设备。面向支持键盘操作的终端。对象为配备彩色显示器(640×200像素)、键盘操作功能以及图形用户接口的手机。NOKIA9210就Crystal的代表。至于我们熟悉的诺基亚7650、6600和7610以及索爱P800、P900和P910等则是Pearl珍珠系列的"智能手机"了。

Symbian的版本介绍

       1999 年3月Symbian推出了Symbian5.0操作系统,它的主要内核集合了网络,无线文字,电子邮件,名片薄以及个人信息助理,同时还具有支持标准网络页面的浏览器,配合java语言的支持,使得Symbian可以运行小型的应用程序。不过这个版本采用的机型甚少,基本上与EPOC没有太多的差别。而Symbian 6.0则在5.0的基础上增加了,GPRS、WAP1.2浏览器以及蓝牙技术的支持,用户可以运行第三方基于C++和J2ME开发的程序。而Symbian 6.1则是和Symbian 6.0相比主要增加了对USB的支持。Symbian 6.0的主要特点是: 支持语音通话和数据通信 ,支持Bluetooth和WAP ,配备安全性功能(SSL,HTTPS,WTLS) ,采用16bit Unicode,支持多语言显示 ,采用“PersonalJava 3.0”和“JavaPhone 1.0” 。

       Symbian 7.0则支持多模式和3G手机,可以让制造商们可以面向全世界推出可以运行于所有网络之上的Symbian OS手机,而且可以不对代码进行重大改动的情况下就可以重新使用许多目前已有的软件应用。7.0包含一些新的通讯、消息、联网和应用开发技术,并对一些与安全和认证相关的功能进行了改进。Symbian OS 7.0的其他功能包括:支持灵活的用户界面,例如Nokia的Series 60;支持几种音频/图像格式和许多面向游戏开发人员的API;全力的加密和认证管理,基于安全通讯协议(包括HTTPS、WTLS和SSL)及认证的应用安装;和Over-the-air(OTA)SyncML同步支持。

       2004年2月,Symbian在授权LG等公司的时候,也发布了最新的Symbian8 .0版本。该版本改善了实时系统性能,提高了原有操作系统的兼容能力。此外,Symbian OS 8.0的软件工具改进了远程接入控制系统功能,运用调节装置消除手机用户使用增值服务时会受到的干扰。这个系统包含了绝对现代化的多媒体和Java设备,支持多种标准,其中包括JSR118, CLDC1.1 (JSR139),MobileMedia (JSR135),3D图像数据(JSR184), JTWI 1.0 c(JSR185)。最后,新版OS还支持SDIO。

2005年07月09日

 

http://www.mobisoft.cn/blog/more.asp?name=symbian&id=60#190

1 安装SDKVC

Nokia根据手机的屏幕大小和价格高低把手机分成了多个系列,现在使用的系列有:Series 40Series 60Series 80 Series 9060系列采用Symbian os 6.1,然后又根据手机屏幕的特点对UI做了一些修改,这个被修改了的Symbian就被称为Nokia60系列平台。使用60系列的手机型号包括:Nokia 6670 Nokia 6630 Nokia 6260 Nokia N-Gage QD™ Nokia 7610 Nokia 6620 Nokia 3620 Nokia 3660 Nokia 6600 Nokia 3600Nokia 3650Nokia 7650Nokia N-Gage™等。

下面我们就以60系列为例,介绍SDK的安装过程。

1.1 安装SDK

第一步,到Nokia论坛注册,下载最新的SDKNokia 网站提供的Series 60 SDK for Symbian OS Nokia Edition SDK最新版本是v1.2Series 60 SDK for Symbian OS的最新版本是v2.1。下载网址:http://www.forum.nokia.com/main/0,6566,034-4,00.html

第二步,到http://www.activestate.com 网站下载最新的Active Perl Script 安装程序。到http://www.java.com/en/download/manual.jsp 下载最新的J2RE

第三步:安装SDK,推荐为Symbian开发单独建一个目录,例如d\Symbian而不是使用C:\program files等这样的目录。

第四步:安装Active PerlJ2RE,安装到默认目录即可。

第五步:检查环境变量设定。打开系统环境变量tab,然后看看有没有EPOCROOT,如果有的话,把它手动改成“\ 。改完之后应该是这个样子的:

EPOCROOT = \

然后,在系统PATH中加入 \epoc32\tools目录以及\epoc32\gcc\bin目录就可以了。

实际上,Symbian SDK根本不用安装,直接把epoc32目录拷贝到一个机器上,然后照上述方法设定目录和环境变量就可以了。

1.2 配置VC

如果我们使用的是VC 6.0,我们要保证系统至少打了SP3补丁,否则系统会有警告提示。如果我们使用的是VS.NET2003, 我们就只能安装Series 60 SDK for Symbian OS v2.1,因为Series 60 SDK for Symbian OS Nokia Edition SDK v1.2VS.NET2003无法正确建立工程。

如果要直接在vc6里创建新项目,要把\Symbian\6.1\Series60\Series60Tools\ Application Wizard目录下的 AvkonAppWiz.awxAVKONAPPWIZ.HLP文件拷贝到vc6的模板目录C:\Program Files\ Microsoft Visual Studio\ Common\ MSDev98\ Template下。这样我们就可以在VC的新建工程中看到Series 60 AppWizard v 1.9这个选项.

    填入Project Name 以后,确认。
   

一路“Next”,一个最简单的Symbian应用程序就建立好了。

如果要将已经建立好的工程导入到VC6.0中,比如我们将SDK中的例子HelloWorld转换成一个VC6的项目,我们首先进入\Symbian\6.1\Series60\Series60Ex\HelloWorld目录。在这里我们可以看到,在Symbian中,一个Project通常是按inc, src, group等目录组织,group目录里通常放的是项目文件,所以编译时要先到这里。用命令提示符模式进入刚才说的那个目录下,然后执行:

bldmake bldfiles

这个命令会在group目录下生成一个abld.bat的批处理文件,并且会在\Symbian \6.1\Series60\Epoc32\BUILD下生成\Symbian\6.1\Series60\Epoc32\BUILD\SYMBIAN\6.1\ SERIES60\SERIES60EX\HELLOWORLD\GROUP这个目录,并在最底层目录下生成一堆 .make文件。

然后,我们在同一个目录运行刚才生成的abld.bat

abld makefile vc6

这样就会自动生成vc6dsw文件,位置在\Symbian\6.1\Series60\Epoc32\BUILD\ SYMBIAN\6.1\ SERIES60\SERIES60EX\HELLOWORLD\GROUP\HELLOWORLD\WINS。然后我们就可以在VC6种打开这个Symbian工程了。

2 编译

我们可以直接使用SDK提供的工具编译Symbian 工程,也可以使用VC6提供的集成环境来编译转化过的Symbian 工程。编译的结果存放在\Symbian\6.1\Series60\Epoc32\ Release\wins\UDEB\Z\SYSTEM\apps目录中。

2.1使用SDK提供的工具编译Symbian 工程

我们在上一节的那个位置继续输入:

abld build wins udeb

这个命令会编译我们的程序,最后在\Symbian\6.1\Series60\Epoc32\Release\wins\UDEB目录下生成我们的helloworld,然后我们可以从开始菜单里运行模拟器的debug版,在模拟其中就可以运行helloworld了。

2.2 使用VC6编译Symbian 工程

我们直接打开运行abld makefile vc6后生成的dsw文件,VC自动装载转化过的工程。按F7便可以直接编译工程,编译结果同样放在\Symbian\6.1\Series60\Epoc32\Release\ wins\UDEB目录中。然后我们打开模拟器debug 版,就可以看到我们编译好的工程了。



 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

如果要将已经建立好的工程导入到VC6.0中,比如我们将SDK中的例子HelloWorld转换成一个VC6的项目,我们首先进入\Symbian\6.1\Series60\Series60Ex\HelloWorld目录。在这里我们可以看到,在Symbian中,一个Project通常是按inc, src, group等目录组织,group目录里通常放的是项目文件,所以编译时要先到这里。用命令提示符模式进入刚才说的那个目录下,然后执行:

bldmake bldfiles

这个命令会在group目录下生成一个abld.bat的批处理文件,并且会在\Symbian \6.1\Series60\Epoc32\BUILD下生成\Symbian\6.1\Series60\Epoc32\BUILD\SYMBIAN\6.1\ SERIES60\SERIES60EX\HELLOWORLD\GROUP这个目录,并在最底层目录下生成一堆 .make文件。

然后,我们在同一个目录运行刚才生成的abld.bat

abld makefile vc6

这样就会自动生成vc6dsw文件,位置在\Symbian\6.1\Series60\Epoc32\BUILD\ SYMBIAN\6.1\ SERIES60\SERIES60EX\HELLOWORLD\GROUP\HELLOWORLD\WINS。然后我们就可以在VC6种打开这个Symbian工程了。

2 编译

我们可以直接使用SDK提供的工具编译Symbian 工程,也可以使用VC6提供的集成环境来编译转化过的Symbian 工程。编译的结果存放在\Symbian\6.1\Series60\Epoc32\ Release\wins\UDEB\Z\SYSTEM\apps目录中。

2.1使用SDK提供的工具编译Symbian 工程

我们在上一节的那个位置继续输入:

abld build wins udeb

这个命令会编译我们的程序,最后在\Symbian\6.1\Series60\Epoc32\Release\wins\UDEB目录下生成我们的helloworld,然后我们可以从开始菜单里运行模拟器的debug版,在模拟其中就可以运行helloworld了。

2.2 使用VC6编译Symbian 工程

我们直接打开运行abld makefile vc6后生成的dsw文件,VC自动装载转化过的工程。按F7便可以直接编译工程,编译结果同样放在\Symbian\6.1\Series60\Epoc32\Release\ wins\UDEB目录中。然后我们打开模拟器debug 版,就可以看到我们编译好的工程了。



 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

如果要将已经建立好的工程导入到VC6.0中,比如我们将SDK中的例子HelloWorld转换成一个VC6的项目,我们首先进入\Symbian\6.1\Series60\Series60Ex\HelloWorld目录。在这里我们可以看到,在Symbian中,一个Project通常是按inc, src, group等目录组织,group目录里通常放的是项目文件,所以编译时要先到这里。用命令提示符模式进入刚才说的那个目录下,然后执行:

bldmake bldfiles

这个命令会在group目录下生成一个abld.bat的批处理文件,并且会在\Symbian \6.1\Series60\Epoc32\BUILD下生成\Symbian\6.1\Series60\Epoc32\BUILD\SYMBIAN\6.1\ SERIES60\SERIES60EX\HELLOWORLD\GROUP这个目录,并在最底层目录下生成一堆 .make文件。

然后,我们在同一个目录运行刚才生成的abld.bat

abld makefile vc6

这样就会自动生成vc6dsw文件,位置在\Symbian\6.1\Series60\Epoc32\BUILD\ SYMBIAN\6.1\ SERIES60\SERIES60EX\HELLOWORLD\GROUP\HELLOWORLD\WINS。然后我们就可以在VC6种打开这个Symbian工程了。

2 编译

我们可以直接使用SDK提供的工具编译Symbian 工程,也可以使用VC6提供的集成环境来编译转化过的Symbian 工程。编译的结果存放在\Symbian\6.1\Series60\Epoc32\ Release\wins\UDEB\Z\SYSTEM\apps目录中。

2.1使用SDK提供的工具编译Symbian 工程

我们在上一节的那个位置继续输入:

abld build wins udeb

这个命令会编译我们的程序,最后在\Symbian\6.1\Series60\Epoc32\Release\wins\UDEB目录下生成我们的helloworld,然后我们可以从开始菜单里运行模拟器的debug版,在模拟其中就可以运行helloworld了。

2.2 使用VC6编译Symbian 工程

我们直接打诵?/span>abld makefile vc6后生成的dsw文件,VC自动装载转化过的工程。按F7便可以直接编译工程,编译结果同样放在\Symbian\6.1\Series60\Epoc32\Release\ wins\UDEB目录中。然后我们打开模拟器debug 版,就可以看到我们编译好的工程了。



 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW



 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

一路“Next”,一个最简单的Symbian应用程序就建立好了。

如果要将已经建立好的工程导入到VC6.0中,比如我们将SDK中的例子HelloWorld转换成一个VC6的项目,我们首先进入\Symbian\6.1\Series60\Series60Ex\HelloWorld目录。在这里我们可以看到,在Symbian中,一个Project通常是按inc, src, group等目录组织,group目录里通常放的是项目文件,所以编译时要先到这里。用命令提示符模式进入刚才说的那个目录下,然后执行:

bldmake bldfiles

这个命令会在group目录下生成一个abld.bat的批处理文件,并且会在\Symbian \6.1\Series60\Epoc32\BUILD下生成\Symbian\6.1\Series60\Epoc32\BUILD\SYMBIAN\6.1\ SERIES60\SERIES60EX\HELLOWORLD\GROUP这个目录,并在最底层目录下生成一堆 .make文件。

然后,我们在同一个目录运行刚才生成的abld.bat

abld makefile vc6

这样就会自动生成vc6dsw文件,位置在\Symbian\6.1\Series60\Epoc32\BUILD\ SYMBIAN\6.1\ SERIES60\SERIES60EX\HELLOWORLD\GROUP\HELLOWORLD\WINS。然后我们就可以在VC6种打开这个Symbian工程了。

2 编译

我们可以直接使用SDK提供的工具编译Symbian 工程,也可以使用VC6提供的集成环境来编译转化过的Symbian 工程。编译的结果存放在\Symbian\6.1\Series60\Epoc32\ Release\wins\UDEB\Z\SYSTEM\apps目录中。

2.1使用SDK提供的工具编译Symbian 工程

我们在上一节的那个位置继续输入:

abld build wins udeb

这个命令会编译我们的程序,最后在\Symbian\6.1\Series60\Epoc32\Release\wins\UDEB目录下生成我们的helloworld,然后我们可以从开始菜单里运行模拟器的debug版,在模拟其中就可以运行helloworld了。

2.2 使用VC6编译Symbian 工程

我们直接打开运行abld makefile vc6后生成的dsw文件,VC自动装载转化过的工程。按F7便可以直接编译工程,编译结果同样放在\Symbian\6.1\Series60\Epoc32\Release\ wins\UDEB目录中。然后我们打开模拟器debug 版,就可以看到我们编译好的工程了。



 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

如果要将已经建立好的工程导入到VC6.0中,比如我们将SDK中的例子HelloWorld转换成一个VC6的项目,我们首先进入\Symbian\6.1\Series60\Series60Ex\HelloWorld目录。在这里我们可以看到,在Symbian中,一个Project通常是按inc, src, group等目录组织,group目录里通常放的是项目文件,所以编译时要先到这里。用命令提示符模式进入刚才说的那个目录下,然后执行:

bldmake bldfiles

这个命令会在group目录下生成一个abld.bat的批处理文件,并且会在\Symbian \6.1\Series60\Epoc32\BUILD下生成\Symbian\6.1\Series60\Epoc32\BUILD\SYMBIAN\6.1\ SERIES60\SERIES60EX\HELLOWORLD\GROUP这个目录,并在最底层目录下生成一堆 .make文件。

然后,我们在同一个目录运行刚才生成的abld.bat

abld makefile vc6

这样就会自动生成vc6dsw文件,位置在\Symbian\6.1\Series60\Epoc32\BUILD\ SYMBIAN\6.1\ SERIES60\SERIES60EX\HELLOWORLD\GROUP\HELLOWORLD\WINS。然后我们就可以在VC6种打开这个Symbian工程了。

2 编译

我们可以直接使用SDK提供的工具编译Symbian 工程,也可以使用VC6提供的集成环境来编译转化过的Symbian 工程。编译的结果存放在\Symbian\6.1\Series60\Epoc32\ Release\wins\UDEB\Z\SYSTEM\apps目录中。

2.1使用SDK提供的工具编译Symbian 工程

我们在上一节的那个位置继续输入:

abld build wins udeb

这个命令会编译我们的程序,最后在\Symbian\6.1\Series60\Epoc32\Release\wins\UDEB目录下生成我们的helloworld,然后我们可以从开始菜单里运行模拟器的debug版,在模拟其中就可以运行helloworld了。

2.2 使用VC6编译Symbian 工程

我们直接打开运行abld makefile vc6后生成的dsw文件,VC自动装载转化过的工程。按F7便可以直接编译工程,编译结果同样放在\Symbian\6.1\Series60\Epoc32\Release\ wins\UDEB目录中。然后我们打开模拟器debug 版,就可以看到我们编译好的工程了。



 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

如果要将已经建立好的工程导入到VC6.0中,比如我们将SDK中的例子HelloWorld转换成一个VC6的项目,我们首先进入\Symbian\6.1\Series60\Series60Ex\HelloWorld目录。在这里我们可以看到,在Symbian中,一个Project通常是按inc, src, group等目录组织,group目录里通常放的是项目文件,所以编译时要先到这里。用命令提示符模式进入刚才说的那个目录下,然后执行:

bldmake bldfiles

这个命令会在group目录下生成一个abld.bat的批处理文件,并且会在\Symbian \6.1\Series60\Epoc32\BUILD下生成\Symbian\6.1\Series60\Epoc32\BUILD\SYMBIAN\6.1\ SERIES60\SERIES60EX\HELLOWORLD\GROUP这个目录,并在最底层目录下生成一堆 .make文件。

然后,我们在同一个目录运行刚才生成的abld.bat

abld makefile vc6

这样就会自动生成vc6dsw文件,位置在\Symbian\6.1\Series60\Epoc32\BUILD\ SYMBIAN\6.1\ SERIES60\SERIES60EX\HELLOWORLD\GROUP\HELLOWORLD\WINS。然后我们就可以在VC6种打开这个Symbian工程了。

2 编译

我们可以直接使用SDK提供的工具编译Symbian 工程,也可以使用VC6提供的集成环境来编译转化过的Symbian 工程。编译的结果存放在\Symbian\6.1\Series60\Epoc32\ Release\wins\UDEB\Z\SYSTEM\apps目录中。

2.1使用SDK提供的工具编译Symbian 工程

我们在上一节的那个位置继续输入:

abld build wins udeb

这个命令会编译我们的程序,最后在\Symbian\6.1\Series60\Epoc32\Release\wins\UDEB目录下生成我们的helloworld,然后我们可以从开始菜单里运行模拟器的debug版,在模拟其中就可以运行helloworld了。

2.2 使用VC6编译Symbian 工程

我们直接打开运行abld makefile vc6后生成的dsw文件,VC自动装载转化过的工程。按F7便可以直接编译工程,编译结果同样放在\Symbian\6.1\Series60\Epoc32\Release\ wins\UDEB目录中。然后我们打开模拟器debug 版,就可以看到我们编译好的工程了。



 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

一路“Next”,一个最简单的Symbian应用程序就建立好了。

如果要将已经建立好的工程导入到VC6.0中,比如我们将SDK中的例子HelloWorld转换成一个VC6的项目,我们首先进入\Symbian\6.1\Series60\Series60Ex\HelloWorld目录。在这里我们可以看到,在Symbian中,一个Project通常是按inc, src, group等目录组织,group目录里通常放的是项目文件,所以编译时要先到这里。用命令提示符模式进入刚才说的那个目录下,然后执行:

bldmake bldfiles

这个命令会在group目录下生成一个abld.bat的批处理文件,并且会在\Symbian \6.1\Series60\Epoc32\BUILD下生成\Symbian\6.1\Series60\Epoc32\BUILD\SYMBIAN\6.1\ SERIES60\SERIES60EX\HELLOWORLD\GROUP这个目录,并在最底层目录下生成一堆 .make文件。

然后,我们在同一个目录运行刚才生成的abld.bat

abld makefile vc6

这样就会自动生成vc6dsw文件,位置在\Symbian\6.1\Series60\Epoc32\BUILD\ SYMBIAN\6.1\ SERIES60\SERIES60EX\HELLOWORLD\GROUP\HELLOWORLD\WINS。然后我们就可以在VC6种打开这个Symbian工程了。

2 编译

我们可以直接使用SDK提供的工具编译Symbian 工程,也可以使用VC6提供的集成环境来编译转化过的Symbian 工程。编译的结果存放在\Symbian\6.1\Series60\Epoc32\ Release\wins\UDEB\Z\SYSTEM\apps目录中。

2.1使用SDK提供的工具编译Symbian 工程

我们在上一节的那个位置继续输入:

abld build wins udeb

这个命令会编译我们的程序,最后在\Symbian\6.1\Series60\Epoc32\Release\wins\UDEB目录下生成我们的helloworld,然后我们可以从开始菜单里运行模拟器的debug版,在模拟其中就可以运行helloworld了。

2.2 使用VC6编译Symbian 工程

我们直接打开运行abld makefile vc6后生成的dsw文件,VC自动装载转化过的工程。按F7便可以直接编译工程,编译结果同样放在\Symbian\6.1\Series60\Epoc32\Release\ wins\UDEB目录中。然后我们打开模拟器debug 版,就可以看到我们编译好的工程了。



 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

如果要将已经建立好的工程导入到VC6.0中,比如我们将SDK中的例子HelloWorld转换成一个VC6的项目,我们首先进入\Symbian\6.1\Series60\Series60Ex\HelloWorld目录。在这里我们可以看到,在Symbian中,一个Project通常是按inc, src, group等目录组织,group目录里通常放的是项目文件,所以编译时要先到这里。用命令提示符模式进入刚才说的那个目录下,然后执行:

bldmake bldfiles

这个命令会在group目录下生成一个abld.bat的批处理文件,并且会在\Symbian \6.1\Series60\Epoc32\BUILD下生成\Symbian\6.1\Series60\Epoc32\BUILD\SYMBIAN\6.1\ SERIES60\SERIES60EX\HELLOWORLD\GROUP这个目录,并在最底层目录下生成一堆 .make文件。

然后,我们在同一个目录运行刚才生成的abld.bat

abld makefile vc6

这样就会自动生成vc6dsw文件,位置在\Symbian\6.1\Series60\Epoc32\BUILD\ SYMBIAN\6.1\ SERIES60\SERIES60EX\HELLOWORLD\GROUP\HELLOWORLD\WINS。然后我们就可以在VC6种打开这个Symbian工程了。

2 编译

我们可以直接使用SDK提供的工具编译Symbian 工程,也可以使用VC6提供的集成环境来编译转化过的Symbian 工程。编译的结果存放在\Symbian\6.1\Series60\Epoc32\ Release\wins\UDEB\Z\SYSTEM\apps目录中。

2.1使用SDK提供的工具编译Symbian 工程

我们在上一节的那个位置继续输入:

abld build wins udeb

这个命令会编译我们的程序,最后在\Symbian\6.1\Series60\Epoc32\Release\wins\UDEB目录下生成我们的helloworld,然后我们可以从开始菜单里运行模拟器的debug版,在模拟其中就可以运行helloworld了。

2.2 使用VC6编译Symbian 工程

我们直接打开运行abld makefile vc6后生成的dsw文件,VC自动装载转化过的工程。按F7便可以直接编译工程,编译结果同样放在\Symbian\6.1\Series60\Epoc32\Release\ wins\UDEB目录中。然后我们打开模拟器debug 版,就可以看到我们编译好的工程了。



 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

如果要将已经建立好的工程导入到VC6.0中,比如我们将SDK中的例子HelloWorld转换成一个VC6的项目,我们首先进入\Symbian\6.1\Series60\Series60Ex\HelloWorld目录。在这里我们可以看到,在Symbian中,一个Project通常是按inc, src, group等目录组织,group目录里通常放的是项目文件,所以编译时要先到这里。用命令提示符模式进入刚才说的那个目录下,然后执行:

bldmake bldfiles

这个命令会在group目录下生成一个abld.bat的批处理文件,并且会在\Symbian \6.1\Series60\Epoc32\BUILD下生成\Symbian\6.1\Series60\Epoc32\BUILD\SYMBIAN\6.1\ SERIES60\SERIES60EX\HELLOWORLD\GROUP这个目录,并在最底层目录下生成一堆 .make文件。

然后,我们在同一个目录运行刚才生成的abld.bat

abld makefile vc6

这样就会自动生成vc6dsw文件,位置在\Symbian\6.1\Series60\Epoc32\BUILD\ SYMBIAN\6.1\ SERIES60\SERIES60EX\HELLOWORLD\GROUP\HELLOWORLD\WINS。然后我们就可以在VC6种打开这个Symbian工程了。

2 编译

我们可以直接使用SDK提供的工具编译Symbian 工程,也可以使用VC6提供的集成环境来编译转化过的Symbian 工程。编译的结果存放在\Symbian\6.1\Series60\Epoc32\ Release\wins\UDEB\Z\SYSTEM\apps目录中。

2.1使用SDK提供的工具编译Symbian 工程

我们在上一节的那个位置继续输入:

abld build wins udeb

这个命令会编译我们的程序,最后在\Symbian\6.1\Series60\Epoc32\Release\wins\UDEB目录下生成我们的helloworld,然后我们可以从开始菜单里运行模拟器的debug版,在模拟其中就可以运行helloworld了。

2.2 使用VC6编译Symbian 工程

我们直接打诵?/span>abld makefile vc6后生成的dsw文件,VC自动装载转化过的工程。按F7便可以直接编译工程,编译结果同样放在\Symbian\6.1\Series60\Epoc32\Release\ wins\UDEB目录中。然后我们打开模拟器debug 版,就可以看到我们编译好的工程了。



 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW



 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

一路“Next”,一个最简单的Symbian应用程序就建立好了。

如果要将已经建立好的工程导入到VC6.0中,比如我们将SDK中的例子HelloWorld转换成一个VC6的项目,我们首先进入\Symbian\6.1\Series60\Series60Ex\HelloWorld目录。在这里我们可以看到,在Symbian中,一个Project通常是按inc, src, group等目录组织,group目录里通常放的是项目文件,所以编译时要先到这里。用命令提示符模式进入刚才说的那个目录下,然后执行:

bldmake bldfiles

这个命令会在group目录下生成一个abld.bat的批处理文件,并且会在\Symbian \6.1\Series60\Epoc32\BUILD下生成\Symbian\6.1\Series60\Epoc32\BUILD\SYMBIAN\6.1\ SERIES60\SERIES60EX\HELLOWORLD\GROUP这个目录,并在最底层目录下生成一堆 .make文件。

然后,我们在同一个目录运行刚才生成的abld.bat

abld makefile vc6

这样就会自动生成vc6dsw文件,位置在\Symbian\6.1\Series60\Epoc32\BUILD\ SYMBIAN\6.1\ SERIES60\SERIES60EX\HELLOWORLD\GROUP\HELLOWORLD\WINS。然后我们就可以在VC6种打开这个Symbian工程了。

2 编译

我们可以直接使用SDK提供的工具编译Symbian 工程,也可以使用VC6提供的集成环境来编译转化过的Symbian 工程。编译的结果存放在\Symbian\6.1\Series60\Epoc32\ Release\wins\UDEB\Z\SYSTEM\apps目录中。

2.1使用SDK提供的工具编译Symbian 工程

我们在上一节的那个位置继续输入:

abld build wins udeb

这个命令会编译我们的程序,最后在\Symbian\6.1\Series60\Epoc32\Release\wins\UDEB目录下生成我们的helloworld,然后我们可以从开始菜单里运行模拟器的debug版,在模拟其中就可以运行helloworld了。

2.2 使用VC6编译Symbian 工程

我们直接打开运行abld makefile vc6后生成的dsw文件,VC自动装载转化过的工程。按F7便可以直接编译工程,编译结果同样放在\Symbian\6.1\Series60\Epoc32\Release\ wins\UDEB目录中。然后我们打开模拟器debug 版,就可以看到我们编译好的工程了。



 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

如果要将已经建立好的工程导入到VC6.0中,比如我们将SDK中的例子HelloWorld转换成一个VC6的项目,我们首先进入\Symbian\6.1\Series60\Series60Ex\HelloWorld目录。在这里我们可以看到,在Symbian中,一个Project通常是按inc, src, group等目录组织,group目录里通常放的是项目文件,所以编译时要先到这里。用命令提示符模式进入刚才说的那个目录下,然后执行:

bldmake bldfiles

这个命令会在group目录下生成一个abld.bat的批处理文件,并且会在\Symbian \6.1\Series60\Epoc32\BUILD下生成\Symbian\6.1\Series60\Epoc32\BUILD\SYMBIAN\6.1\ SERIES60\SERIES60EX\HELLOWORLD\GROUP这个目录,并在最底层目录下生成一堆 .make文件。

然后,我们在同一个目录运行刚才生成的abld.bat

abld makefile vc6

这样就会自动生成vc6dsw文件,位置在\Symbian\6.1\Series60\Epoc32\BUILD\ SYMBIAN\6.1\ SERIES60\SERIES60EX\HELLOWORLD\GROUP\HELLOWORLD\WINS。然后我们就可以在VC6种打开这个Symbian工程了。

2 编译

我们可以直接使用SDK提供的工具编译Symbian 工程,也可以使用VC6提供的集成环境来编译转化过的Symbian 工程。编译的结果存放在\Symbian\6.1\Series60\Epoc32\ Release\wins\UDEB\Z\SYSTEM\apps目录中。

2.1使用SDK提供的工具编译Symbian 工程

我们在上一节的那个位置继续输入:

abld build wins udeb

这个命令会编译我们的程序,最后在\Symbian\6.1\Series60\Epoc32\Release\wins\UDEB目录下生成我们的helloworld,然后我们可以从开始菜单里运行模拟器的debug版,在模拟其中就可以运行helloworld了。

2.2 使用VC6编译Symbian 工程

我们直接打开运行abld makefile vc6后生成的dsw文件,VC自动装载转化过的工程。按F7便可以直接编译工程,编译结果同样放在\Symbian\6.1\Series60\Epoc32\Release\ wins\UDEB目录中。然后我们打开模拟器debug 版,就可以看到我们编译好的工程了。



 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

如果要将已经建立好的工程导入到VC6.0中,比如我们将SDK中的例子HelloWorld转换成一个VC6的项目,我们首先进入\Symbian\6.1\Series60\Series60Ex\HelloWorld目录。在这里我们可以看到,在Symbian中,一个Project通常是按inc, src, group等目录组织,group目录里通常放的是项目文件,所以编译时要先到这里。用命令提示符模式进入刚才说的那个目录下,然后执行:

bldmake bldfiles

这个命令会在group目录下生成一个abld.bat的批处理文件,并且会在\Symbian \6.1\Series60\Epoc32\BUILD下生成\Symbian\6.1\Series60\Epoc32\BUILD\SYMBIAN\6.1\ SERIES60\SERIES60EX\HELLOWORLD\GROUP这个目录,并在最底层目录下生成一堆 .make文件。

然后,我们在同一个目录运行刚才生成的abld.bat

abld makefile vc6

这样就会自动生成vc6dsw文件,位置在\Symbian\6.1\Series60\Epoc32\BUILD\ SYMBIAN\6.1\ SERIES60\SERIES60EX\HELLOWORLD\GROUP\HELLOWORLD\WINS。然后我们就可以在VC6种打开这个Symbian工程了。

2 编译

我们可以直接使用SDK提供的工具编译Symbian 工程,也可以使用VC6提供的集成环境来编译转化过的Symbian 工程。编译的结果存放在\Symbian\6.1\Series60\Epoc32\ Release\wins\UDEB\Z\SYSTEM\apps目录中。

2.1使用SDK提供的工具编译Symbian 工程

我们在上一节的那个位置继续输入:

abld build wins udeb

这个命令会编译我们的程序,最后在\Symbian\6.1\Series60\Epoc32\Release\wins\UDEB目录下生成我们的helloworld,然后我们可以从开始菜单里运行模拟器的debug版,在模拟其中就可以运行helloworld了。

2.2 使用VC6编译Symbian 工程

我们直接打开运行abld makefile vc6后生成的dsw文件,VC自动装载转化过的工程。按F7便可以直接编译工程,编译结果同样放在\Symbian\6.1\Series60\Epoc32\Release\ wins\UDEB目录中。然后我们打开模拟器debug 版,就可以看到我们编译好的工程了。



 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

 

 

3 打包

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

3.1.检查程序

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfilesabld build wins udeb,然后打开模拟器,检测程序有无错误。

3.2.编译工程

在程序无错误后,在命令行输入abld build armi urel 执行这个命令之后会在目录d:\symbian\6.1\series60\epoc32\release\armi\urel生成HELLOWORLD.APPHELLOWORLD.RSC两个文件。

3.3.建立.pkg文件

d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis  用记事本建立或者修改工程的pkg文件,内容如下:

; HelloWorld.pkg

;

;Language – standard language definitions

&EN

 

 

; standard SIS file header

#{"HelloWorld"},(0×10005B91),1,0,0

 

 

;Supports Series 60 v 1.2

(0×101F8202), 0, 0, 0, {"Series60ProductID"}

;

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"

"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"

其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安装的文件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:\system\apps ”。

编辑好pkg文件后,保存至相应目录。

3.4.打包程序

在命令行中,转至pkg文件所在目录,运行命令makesis HelloW

2005年06月16日

摘要

    本文给出了一个飞机射击类(潜艇)游戏的设计过程以及相应的流程图,并提供了Demo版源代码下载地址,游戏在sun wtk v2.2 下调试通过。

声明:本游戏所用的资源大多不属于作者,代码仅供非商业用途的学习参考。

以下为游戏的几张截图



游戏设计

1 游戏操作流程:

    游戏的初始画面是一个implusiveList列表格式,选择new game以后就可以启动游戏,游戏是以全屏方式开启,但仍有用于暂停/开始和退出的命令响应功能键。在游戏当中启动暂停,海水和海洋生物仍将继续活动,但敌方潜艇和所有鱼雷都将静止下来,玩家的控制也将不起作用,直到游戏被再次启动为止。从游戏状态退出将回到菜单界面,再次选择退出将退出程序。

以下是游戏的总体流程图:




2 算法处理

游戏自身是一个单态结构(singletone),由一个Controller来处理目前应该显现的屏幕和状态。主要的显示类包括主画面,游戏画布,帮助画面和一些辅助的Alert,其中最重要是游戏画面。游戏是在MIDP 2的状态下运行的,所以画面继承了GameCanvas。游戏中的角色图层全部加载在一个远大于手机屏幕大小的图层管理器上。当玩家位置移动时,图层管理器同步计算出玩家的相对位置,移动当前图层的显示位置。

这个游戏的本质就是在midlet启动后把整个画布作为一个线程,每隔25ms扫描一下用户按键操作,每隔50ms扫描一次敌人和鱼雷等物体的运动状态,对于比较苛求的子弹射出实时响应,则继承了keyPressed方法。

在扫描玩家移动操作时,按键编码被传入到玩家潜艇的响应方法。在扫描敌人和鱼雷运动时,分两步完成。

第一步,执行各个物体画面的移动方法。程序并不为每个新增鱼雷或者敌人开启一个新线程,太多线程会造成程序的性能直线下降;而是为每一个物体类型保留一个Vector数组,每当一个新物体产生,他将首先被加入改类型所属的数组中,然后才在图层上画出;当物体消除时,除了在图层上被消除,也需要从响应数组中删除。这样就形成一种注册机制,所有游戏物体的产生和消除都需要向画布注册,画布拥有不同类型物体的所有“名单”,所以,当执行移动命令时,只需要遍历各个类型数组,依次执行其中每个元素的移动方法即可。

第二步,就是一般意义上重画,这里使用flushGraphics()替代了传统的repaint(),由于本游戏是以导入图片为操作对象,图片位置的更改已经在第一步被执行,所以没有怎么涉及到象素级的重画,只是在游戏初始化状态时需要加载各个物体数组所对应的图层到新的图层管理器。


画布触发流程简图:

(由于手上没有rose,只有暂时用EclipseUML的流程图画出草图,若干有问题的地方需要商榷,也希望擅长此到的朋友不吝指正)



3 类结构

以下列出了主要组成类的含义结构,并以游戏画布为中心列出一个类关联图。

Controller: 控制类,用以控制当前屏幕显示哪一个Displayable类。

SubObject: 接口类型。玩家潜艇,敌人潜艇以及鱼雷等可移动图层类型皆扩展于此接口。

Sub: 玩家潜艇。包含了位置,生命值等成员变量以及移动,开火等方法。

EnemySub, MoveableSprite, Tinfish: 敌人潜艇,海洋生物,鱼雷。都是可移动图层类型,一旦产生就在画布中注册,由时间触发器维护其运动和生命状态。

SubCanvas: 游戏主画布。存储着游戏地图信息,游戏状态,玩家信息,同步维护着敌人潜艇,鱼雷,海洋生物的运动和生存状态。

SubCanvas关联类图:





4 源代码

本程序的源代码,包括jad,混淆过的jar和一个rar文件,全部可以在 http://www.hyweb.net/BrowseFiles.aspx?Folder=Public/My%20Project 上下载到,代码中包含了较为详细的注释。这份程序只是一个demo版本,有一些遗留问题(玩家生命值显示,性能优化)还需要进一步完善,有任何好的建议,请一定联系我. ^_^

2005年05月31日

 

哈哈哈哈  终于完成了 ,NND 写了2.

 

 

虽然完成了,虽然在机器上运行了,虽然能运行得很好,还虽然能发消息和能收消息.(说了怎么多虽然了肯定要有"但是"来衬托了),但是啊,还有很多我不满意的地方

 

 

第一:全局变量太多,都怪自己太懒,不愿意传参数,看看一般能设置为全局变量的都设置为全局变量了,懒啊!!下次一定改,不改是小狗!

 

 

第二:程序中没有面向对象的设计风格,虽然定义了几个模块,但是模块之间还是被那些全局变量给联系在一起,整个程序像一团乱麻,剪不断,理还乱,是离愁,恰似一江春水向东流,都说那里去,打住!!

 

 

第三:写作风格有待提高,这里的风格和很多因素有关 自己的能力,扎实的基础,良好的程序设计习惯,等等……..这些都不是一日之功,虽然说不是一日之功,但是要天天注意自己的习惯,就拿那个命名法来说吧,老是忘记,一个字符串老是喜欢写成str  一般的写法是szStr;还有很多东西,比如那个什么指针的分配,在释放指针的空间后老是忘记P=NULL;操作了,.这些基本能力以后写程序的时候慢慢注意点,相信自己很快就能适应.

 

 

还有几个不足地方现在忘记了,下次想到了再写上来吧

谁要源码和我联系

客户端

//==================================头文件============================================

//#include <windows.h>

#include<Winsock2.h>

#include<stdio.h>

#include <process.h>

#include "resource.h"

//==========================定义消息====================================================

#define WM_RECVDATA WM_USER+100

//===========================库文件=====================================================

#pragma comment(lib, "ws2_32.lib")

#pragma comment(lib, "mswsock.lib")

 

 

//========================全局变量=====================================================

HWND g_DialogHwnd;    //定义对话框句柄

SOCKET g_ClientSocket; //定义SOCKET对象用来连接服务器的套结字

char szTempBuffer[9999];

sockaddr_in addrSock;//服务器的地址

//SOCKET g_RecvSocket;//用来接收消息的套结字

//=========================全局函数=====================================================

BOOL CALLBACK DialogFun(HWND, UINT,WPARAM, LPARAM);

DWORD InitSocketVersion();//协议协商

BOOL InitSocket();       //创建并绑定socket

BOOL OnSend();           //用来发送消息的

void __cdecl  ReceiveMessage(void*);//线程函数,用来接受消息的用来监听消息的

 

 

//======================================================================================

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)

{

       MSG msg;

       if(100==DialogBox(hinstance,"mydialog",NULL,(DLGPROC)DialogFun))

       {

              PostQuitMessage(WM_QUIT);

       }

       while (GetMessage(&msg, (HWND) NULL, 0, 0))

       {  

              TranslateMessage(&msg);

              DispatchMessage(&msg);

       }

       //WSACleanup();

       return msg.wParam;

       UNREFERENCED_PARAMETER(lpCmdLine);

      

}

//====================================================================================

BOOL CALLBACK DialogFun(HWND dlghwnd, UINT message,WPARAM wParam, LPARAM lParam)

{

       g_DialogHwnd=dlghwnd;

       switch(message)

       { 

       case WM_PAINT:

              return FALSE;

       case   WM_INITDIALOG :

             

              {  

                     InitSocketVersion();

                     //InitSocket();

                     return FALSE;

              }

       case WM_RECVDATA: //使用接受到消息,并显示于对话框上

              {  

                     char str[9999];

                     GetDlgItemText(g_DialogHwnd,IDC_DISPLAYTEXT,str,9999);

                     sprintf(str,"%s\r\n%s",str,szTempBuffer);

                     SetDlgItemText(g_DialogHwnd,IDC_DISPLAYTEXT,str);

                     SetDlgItemText(g_DialogHwnd,IDC_SENDTEXT,"");

                     SetFocus((HWND)IDC_SENDTEXT);

                     break;

              }

       case WM_COMMAND:

              {

                     switch(LOWORD(wParam))

                     {

                     case IDOK:

                            {

                                   if(MessageBox(g_DialogHwnd,"我想死你了","笨蛋",33)==1)

                                   {

                                          closesocket(g_ClientSocket);

                                          WSACleanup();

                                          EndDialog(g_DialogHwnd,100);//定义100来确定退出对话框

                                   }

                                   break;

                            }

                     case IDC_SEND:

                            {

                                   OnSend();

                                   break;

                            }

                     case IDC_CONNECT:

                            {

                                   //创建新的线程来接受客户端的消息

                                   //InitSocket();

                                   _beginthread(ReceiveMessage,0,(void*)&g_DialogHwnd);

                                   break;

                            }

                            return FALSE;

                     }

                     return FALSE;

              }

              return FALSE;

       }

       return FALSE;

}

 

 

//==================================================================================

DWORD InitSocketVersion()

{

    WSADATA wsaData;

       return WSAStartup( MAKEWORD( 2, 2 ), &wsaData );

}

//===================================================================================

BOOL InitSocket()

{

       g_ClientSocket=socket(AF_INET,SOCK_STREAM,0);//创建数TCP方式的SOCKET

       if(INVALID_SOCKET==g_ClientSocket)//判断是否创建成功

       {

              MessageBox(g_DialogHwnd,"创建SOCKET失败","错误",MB_OK);

              return FALSE;

       }

       //从对话框上取出端口

       BOOL b_ensure;

       int port;

       port=GetDlgItemInt(g_DialogHwnd,IDC_PORT,&b_ensure,FALSE);

       if(FALSE==b_ensure)

       {

              MessageBox(g_DialogHwnd,"取得服务器端口失败","错误",MB_OK);

              return FALSE;

       }

       //从对话框上取得IP地址

       char HostAdress[20];

       if(0==GetDlgItemText(g_DialogHwnd,IDC_IPADDRESS,HostAdress,sizeof(HostAdress)))

       {

              MessageBox(g_DialogHwnd,"取得服务器IP失败","错误",MB_OK);

              return FALSE;

       }

    //填充地址结构体

       addrSock.sin_family=AF_INET;

       addrSock.sin_port=htons(port);

       addrSock.sin_addr.S_un.S_addr=inet_addr(HostAdress);

      

       if (connect(g_ClientSocket, (SOCKADDR*) &addrSock, sizeof(sockaddr_in) ) == SOCKET_ERROR)

       {

              MessageBox(g_DialogHwnd,"连接不了服务器","笨蛋",MB_ICONWARNING);

              WSACleanup();

              return 1;

       }

       //else

       //MessageBox(g_DialogHwnd,"连接成功","恭喜你是成猪了",MB_ICONWARNING);

      

       return TRUE;

}

 

 

BOOL OnSend()

{

       InitSocket();

       char szStrSend[1023];//消息

       char name[12];//名字

       char szSend[1023];

       GetDlgItemText(g_DialogHwnd,IDC_SENDTEXT,szStrSend,1023);

    GetDlgItemText(g_DialogHwnd,IDC_NAME,name,8);

       strcpy(szSend,szStrSend);

       sprintf(szStrSend,"%s%s",name,szSend);

       send(g_ClientSocket,szStrSend,sizeof(szStrSend)+1,0);

       return TRUE;

}

//===================================================================================

void __cdecl ReceiveMessage(void* lpParameter)

{

   while(1)

       {

              char szRecvBuffer[1024];

              if(SOCKET_ERROR==recv(g_ClientSocket,szRecvBuffer,1024,0))break;

              sprintf(szTempBuffer,"%s",szRecvBuffer);

              PostMessage(g_DialogHwnd,WM_RECVDATA,0,0);

       }

}

 

 

 

 

 

 

 

 

服务器端

//==================================头文件============================================

//#include <windows.h>

#include<Winsock2.h>

#include<stdio.h>

#include <process.h>

#include "resource.h"

//==========================定义消息====================================================

#define WM_RECVDATA WM_USER+100

//===========================库文件=====================================================

#pragma comment(lib, "ws2_32.lib")

#pragma comment(lib, "mswsock.lib")

//=========================全局变量=====================================================

char g_szIpAdress[20];//定义IP地址 字符串型的

SOCKET g_Socket;     //定义SOCKET对象

SOCKET g_ClientSocket;//定义接受到的客户端的套结字

HWND g_DialogHwnd;    //定义对话框句柄

char szTempBuffer[9999];

//=========================全局函数=====================================================

BOOL CALLBACK DialogFun(HWND, UINT,WPARAM, LPARAM);

void __cdecl  ReceiveMessage(void*);//线程函数,用来接受消息的用来监听消息的 并显示消息与对话框上,TNND这里要用到多线程处理 麻烦

BOOL GetLocalIP();//取得本主机IP

BOOL SetDlgIpAndPort();//设置为对话框IP

DWORD InitSocketVersion();//协议协商

BOOL InitSocket();   //创建并绑定socket

BOOL OnSend();       //用来发送消息的

//======================================================================================

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)

{

       MSG msg;

       if(100==DialogBox(hinstance,"mydialog",NULL,(DLGPROC)DialogFun))

       {

              PostQuitMessage(WM_QUIT);

       }

       while (GetMessage(&msg, (HWND) NULL, 0, 0))

       {  

              TranslateMessage(&msg);

              DispatchMessage(&msg);

       }

       //WSACleanup();

       return msg.wParam;

       UNREFERENCED_PARAMETER(lpCmdLine);

      

}

//========================================================================================

BOOL CALLBACK DialogFun(HWND dlghwnd, UINT message,WPARAM wParam, LPARAM lParam)

{

       switch(message)

       { 

       case WM_PAINT:

              return FALSE;

       case   WM_INITDIALOG :

             

              {  

                 g_DialogHwnd=dlghwnd;

                     InitSocketVersion();

                     GetLocalIP();

                     SetDlgIpAndPort();

                     InitSocket();

                     listen(g_Socket,5);

                     return FALSE;

              }

       case WM_RECVDATA: //使用接受到消息,并显示于对话框上

              {  

                     char szStr[9999];

                     char szTemp[9999];

                     GetDlgItemText(g_DialogHwnd,IDC_DISPLAYTEXT,szStr,9999);

                     wsprintf(szTemp,"%s\r\n%s",szStr,szTempBuffer);

                     SetDlgItemText(g_DialogHwnd,IDC_DISPLAYTEXT,szTemp);

                     SetDlgItemText(g_DialogHwnd,IDC_SENDTEXT,"");

                     SetFocus((HWND)IDC_SENDTEXT);

              break;

              }

             

       case WM_COMMAND:

              {

                     switch(LOWORD(wParam))

                     {

                     case IDOK:

                            {

                                   if(MessageBox(g_DialogHwnd,"我想死你了","笨蛋",33)==1)

                                   {

                                          closesocket(g_Socket);

                                          closesocket(g_ClientSocket);

                                          WSACleanup();

                                          EndDialog(g_DialogHwnd,100);//定义100来确定退出对话框

                                          //PostQuitMessage(0); //也可以使用这个消息来退出循坏

                                   }

                                   return TRUE;

                            }

                     case IDC_SET_PORTANDIP:

                            {

                                  

                                   //创建新的线程来接受客户端的消息

                                   _beginthread(ReceiveMessage,0,(void*)&g_DialogHwnd);

                                   break;

                            }

                     case IDC_SEND:

                            {

                                   OnSend();

                                   break;

                            }

                     }

                    

                     return FALSE;

              }

              return FALSE;

       }

       return FALSE;

}

//=======================================================================================

BOOL GetLocalIP()

{  

       char NameBuffer[250];//定义存放主机名字的缓冲区

       if(SOCKET_ERROR==gethostname(NameBuffer,sizeof(NameBuffer)))

       {

              return FALSE;

       }

    hostent* IpAdress=gethostbyname(NameBuffer);//IpAdress存放网络字节的IP地址

       if(NULL==inet_ntoa (*(struct in_addr *)*IpAdress->h_addr_list))

       {

              return FALSE;

       }

       //g_szIpAdress来保存IP的地址

       strcpy (g_szIpAdress,inet_ntoa (*(struct in_addr *)*IpAdress->h_addr_list));

       return TRUE;

}

//=====================================================================================

BOOL SetDlgIpAndPort()

{

    SetDlgItemText(g_DialogHwnd,IDC_IPADDRESS,g_szIpAdress);

       SetDlgItemInt(g_DialogHwnd,IDC_PORT,5200,FALSE);

       return 0;

}

 

 

DWORD InitSocketVersion()

{

    WSADATA wsaData;

       return WSAStartup( MAKEWORD( 2, 2 ), &wsaData );

}

//==========================================================================================

BOOL InitSocket()

{

       g_Socket=socket(AF_INET,SOCK_STREAM,0);//创建数TCP方式的SOCKET

       if(INVALID_SOCKET==g_Socket)//判断是否创建成功

       {

              MessageBox(g_DialogHwnd,"创建SOCKET失败","错误",MB_OK);

              return FALSE;

       }

       //从对话框上取出端口

       BOOL b_ensure;

       int port;

       port=GetDlgItemInt(g_DialogHwnd,IDC_PORT,&b_ensure,FALSE);

       if(FALSE==b_ensure)

       {

              MessageBox(g_DialogHwnd,"取得端口失败","错误",MB_OK);

              return FALSE;

       }

       //从对话框上取得IP地址

       char HostAdress[20];

       if(0==GetDlgItemText(g_DialogHwnd,IDC_IPADDRESS,HostAdress,sizeof(HostAdress)))

       {

              MessageBox(g_DialogHwnd,"取得IP失败","错误",MB_OK);

              return FALSE;

       }

    //填充地址结构体

       sockaddr_in addrSock;

       addrSock.sin_family=AF_INET;

       addrSock.sin_port=htons(port);

       addrSock.sin_addr.S_un.S_addr=inet_addr(HostAdress);

       //bind

       if(SOCKET_ERROR==bind(g_Socket,(SOCKADDR*)&addrSock,sizeof(addrSock)))

       {

              closesocket(g_Socket);

              MessageBox(g_DialogHwnd,"BIND失败","错误",MB_OK);

              return FALSE;

       }

       return TRUE;

}

//=================================================================================

void __cdecl ReceiveMessage(void* lpParameter)

{

      

       sockaddr_in m_Client;

       int ClientLen=sizeof(sockaddr_in);

       //下面是开始的时候的错误,TNND 把握居然把accept放在循环外面了 大错了

       //m_ClientSocket=accept(g_Socket,(SOCKADDR*)&m_Client,&ClientLen);

       //char szRecvBuffer[1024];

       while(1)

       {

              g_ClientSocket=accept(g_Socket,(SOCKADDR*)&m_Client,&ClientLen);

              char szRecvBuffer[1024];

              if(SOCKET_ERROR==recv(g_ClientSocket,szRecvBuffer,1024,0))break;

              sprintf(szTempBuffer,"%s",szRecvBuffer);

              PostMessage(g_DialogHwnd,WM_RECVDATA,0,0);

       }

 

 

}

//=================================================================================

BOOL OnSend()

{

       char szStrSend[1023];

       char szName[8];//名字

       char szTempSend[1023];

       GetDlgItemText(g_DialogHwnd,IDC_SENDTEXT,szStrSend,1023);

       GetDlgItemText(g_DialogHwnd,IDC_NAME,szName,8);

       sprintf(szTempSend,"%s:%s",szName,szStrSend);

    send(g_ClientSocket,szTempSend,1024,0);

       return TRUE;

}

 

 

2005年05月26日

  out momory 一阵天旋地转内存又溢出了。在手机上这种痛苦经常都有,套一句俗话在手机上用内存必须勒紧裤腰带。虽然现在pc内存上G都不奇怪,可是在手机上却只能以K来记,可能某位同志会马上跳出来说也有上M的,记住中国还不富大多数手机都是低端手机。写手机程序让我仿佛回到了dos时代(自我安慰一下那个时代也炼出了不少高手说不定我是下一个)。言归正传做内存优化可以归结为以下几种方法。代码优化,图片优化,第三方工具优化等…

  一.代码优化

  内存会溢出肯定和代码逃不了关系,99.99%学java的人都知道垃圾回收器是java的一大优点并据此来嘲笑C++。显然这个特性为代码编写者省了不少事,但这个特性却带来了不少隐患。举个例子在游戏当中经常有不同场景的切换,如从游戏逻辑退到主菜单逻辑,对游戏逻辑对象的态度很多人会选择忘记等待垃圾回收器来收尸。乍看之下似乎并无不妥垃圾回收器会来善后。实际上垃圾回收器并非实时的,它不像C++的Delete语句马上释放不用的内存。当从游戏逻辑切换到主菜单逻辑这时两个对象同时存在很可能这时内存就不够用了。读到这里很多人会发现实际上垃圾回收器在j2me上并不怎么好用,从一个角度上来讲在j2me上所有垃圾必须由手工释放,除简单类型以外所有对象都必须显式地置空例如 imgs=null; 实际上java提供了一个不错的工具用来查找内存溢出,java.lang.Runtime.freeMemory() 。它可以返回当前的剩余内存数,将它适当的安放在代码中可以有效的监测内存使用状况。很大一部份的j2me程序员之前都是从事pc软件开发工作,充裕的内存掩盖了许多写代码的不良习惯。如下所示:

//a 不为空
a=new Logic();

  很多人可能对此有异议,他们会认为新的对象会把旧的对象冲掉并且释放内存。这里面包含两个问题:1. 该段代码是先创建对象然后再进行赋值操作的,也就是说在这期间有两个对象同时存在这就很可能会产生溢出。2. 这样做也会妨碍垃圾回收器的工作
较好的写法如下:

a=null;
a=new Logic();

  虽然麻烦了点但在j2me中还是必要的。接着看下例。

drawString("游戏时间:" + time ,50,50,Graphics.LEFT|Graphics.TOP);

  "游戏时间:" + time 很完美在paint()方法当中每次都被刷一遍显示在屏幕上。危机往往隐藏在美丽的外表,该语句会引起新的内存重新分配来存储 "游戏时间:" + time 而显示完以后又必须由垃圾回收器释放,用了双倍时间,并且容易发生内存溢出。依此类推在重复执行的方法里应尽量避免重复定义对象。与paint()方法类似在循环里也有类似的情况存在。

  把所有对象的初始化放在构造函数里想必是再正当不过了,大多数人通常的做法是把当前逻辑所要用到的资源通通初始化完毕。

  很大一部份的内存溢出都是发生在构造函数中。内存使用的高峰期都是在构造函数中所以避开这个高峰能有效的防止溢出。建议最好的办法是第一次使用时初始化。如下所示

if (img==null){
//初始化
}

  现在做游戏很多时候都需要地图数组,声音数组,还有一些其它资源这些资源很多可以放在代码中也有的可以放在文件当中。

  强烈建议将这些资源放在文件中需要时在load进来。这些资源文件如果放在代码中则会占用不小的代码段空间,而代码一般是程序一运行就装载到内存当中。

  除上面列举的方法外还有一些大家所熟知的顺便一提, 比如关闭没用的rms ,关闭没用的网络连接,关闭没用的流。正确地停止线程。良好的程序架构减少代码偶合性也是一个不错的方法,无论在代码调式,内存释放都可以做到非常清析。

  二. 图片优化

  j2me的内存杀手无疑非图片莫属,一张3k的图片可以占用20多k的内存不信大家把load前后的内存剩余打印出来对比看看。所以防止内存溢出最直接的办法就是从图片入手。

  1.图片压缩: 多数人马上会想到这个办法。不错这个办法是最有效的。在photoshop里图片制作完成后不要选择 "存储为",而是选择 "存储为 web 所用格式" 可以根据里面的选项进行压缩,特别是颜色这一项越小越好不过相应的图像会有所失真。不要认为这样就完了。
实际上该图片还可以再次压缩,在网上有许多类似的工具。推荐一款可以压缩png格式的软件 xat.com Image Optimizer 效果不错。经常都有 70% 的压缩率且图像不会失真。

  假如你有多张规格一样的图片,那么建议你把它做成一张长条图片。有两个原因:

  1、 这样节省存储空间和内存空间。大家可做个试验将10张图片的内容放在一张当中对比看看文件大小有没有变化。

  2 、10张图片需要10个image 对象需要进行10次io操作浪费时间不说还浪费内存。当笔者发现这个好处时兴奋地把所有图片都存成一张,吱地一声内存又溢出了…原因想必大家也知道!!图片太大了不要把不同界面的图片整合在一起否则经常会得不偿失。
作图时还有一些细节需要注意,颜色数量,分辩率,图像模式(最好是索引颜色),画布大小都会影响到图片大小。

  三. 工具优化

  谁都知道混淆器是用来保护代码的以加大反编译的难度(个人认为这是在嘲笑程序员的智商)。实际上用它来优化程序也是不错的选择,至少有两点好处:

  1、 压缩程序大小。一个60k的程序经常可以压掉10k左右。10k的空间对于写低端手机的程序员简直是雪中送碳,多少超过64k限制的游戏都受过它的恩惠;

  2、节省内存空间。用脚去想也想得出来代码少了内存里的代码段自然就短了。

2005年05月25日

在开发网络应用程序的时候,处理业务和通讯流程之间经常会出现矛盾。这种矛盾主要是由于两者之间的不同步造成的。比如,网络的延迟较大,而实际业务处理的速度则相对比较快,那么如果处理完某一事务然后等待发送成功再处理下一个事务则会大大降低效率。当然,如果必须等待则另当别论。但是,如果处理不需要依赖发送的成功,比如流媒体或者某些网络游戏等等,则要考虑一种更好的方法来解决这个问题了。

解决方法之一是建立一个发送消息的队列,然后处理程序将要发送的数据放入队列,然后通讯程序从队列的另一端取出数据发送。这个也是一个标准的生产者消费者模型:业务处理程序是生产者,通讯程序是消费者,两者在不同的线程中运行,而产品则是待发送的数据。这样业务处理程序可以不间断地处理自己的逻辑,只需要把每次处理的结果放入这个发送队列即可。

既然是一个多线程的应用,难免涉及到线程同步的问题。而这个消费者生产者模型在任何操作系统教材中都可以找到,下面是我在VC中实现的这个消息队列。

 

 

typedef deque<MyMsg>  MsgQueue;

MsgQueue msgQueue;              //消息队列

SOCKET connectionSocket;

HANDLE hSThread;              

DWORD dwSThreadId;

HANDLE sSemaphore;

HANDLE sMutex;

 

 

//socket建立等代码略去

//创建线程

hSThread = CreateThread(

            NULL,             

            0,                  

            sendProc,      

            0,            

            0,                

            & dwSThreadId);

//互斥对象

sMutex=CreateMutex(NULL, FALSE, NULL);

//信号量

sSemaphore=CreateSemaphore(NULL, 0, 128, NULL);

 

 

//发送消息的线程

DWORD WINAPI sendProc(PVOID lpParam)

{

    while(true){

        //等待队列非空

              WaitForSingleObject(sSemaphore, INFINITE);

        //等待队列无操作

              WaitForSingleObject(sMutex, INFINITE);

        MyMsg msg;

              if(msgQueue.empty()==false){

                     MyMsg *pmsg=&(msgQueue.front());

                     memcpy(&msg, pmsg, sizeof(msg));                

              }

        ReleaseMutex(sMutex);

        if(send(connectionSocket, (char *)(&msg), sizeof(msg), 0) ==SOCKET_ERROR){

                     int err = WSAGetLastError();

                     //处理错误

              }

              else{

                     //成功发送,将消息出列

                     WaitForSingleObject(sMutex, INFINITE);

                     msgQueue.pop_front();               

                     ReleaseMutex(sMutex);

              }

    }

}

 

 

//发送数据函数,即将一个消息放入队列尾部

void sendMsg(MyMsg msg)

{    

    //等待队列无操作

       WaitForSingleObject(sMutex, INFINITE);

    //入队

       msgQueue.push_back(msg);

    //释放互斥对象

       ReleaseMutex(sMutex);

       //通知有新的消息如对,信号量增加1

       ReleaseSemaphore(sSemaphore, 1, NULL);

}

 

 

这样,我们就完成了一个发送队列的基本模型,显然,这个模型提高了数据处理效率。上面的错误处理处根据情况不通可以有多种选择,比如丢弃该消息或者再次发送等等。在这个模型的基础上,我们可以为每个消息数据添加一些附加信息,比如优先级等等,以适应更复杂的应用需求。总之,发送队列为我们处理网络数据提供了一种思路。


2005年04月13日

  引言

  现在的手机作为一种娱乐性的电子通信设备,早已超出原先的通话、短信息等基本通信功能,越来越多的娱乐、休闲性软件如手机游戏、电子书、音乐编辑、拍照与图象处理等也都流行于当今各种品牌的手机。其中,游戏软件占有相当大的比重。既然我们已经掌握了手机软件的开发过程,为什么不自己开发一个个性化的手机游戏呢?本文将介绍一个简单的图象化手机游戏–"花皮猫大战流氓兔"的制作过程。花皮猫自然是笔者养的爱猫了,感兴趣的读者也完全可以让自己喜欢的阿猫阿狗担当游戏中的主角,充分展示DIY的魅力!

  游戏的设计

  手机游戏的开发首先需要规划好整体流程和具体的游戏规则(或游戏剧本),然后才能根据此剧本进行具体的编码实现。受文章篇幅限制,本游戏剧本设计不能太复杂。首先将游戏定位为人机对弈类游戏,程序运行开始首先显示本游戏的封面画面,停留几秒后自动转入角色选择画面,在玩家选择某一角色后开始游戏。游戏开始时随机决定哪一方先行。人机分别在3乘3大小的棋盘网格中交替落子(双方棋子图案是有区别的),而且只允许在没有落过子的空网格中下子。只要有一方所落棋子在横、竖、斜任何一方向上的总数达到三颗即获胜。如棋盘被填满时双方均未在上述方向达到三颗棋子则该局为平局。无论结果如何,在每局结束后均显示当局胜负结果与总比分。玩家可以选择退出或是重新开始新的一局。以上便是本游戏的主体框架和基本游戏规则,随后进行的编码工作便以此为依据。

  游戏框架的搭建



图1


  首先建立项目并新建一Midlet TicTacToe加入其中,继续添加ChoosePieceScreen、GameScreen和Game三个类到项目。作为一款游戏,如果仍拿文字来作软件封面显得也太不专业了。如果要在J2ME程序中使用图片,必须预先将其转换为png格式图片然后在项目上点击鼠标右键,从新建菜单下选择文件菜单项将弹出如上所示对话框。刚开始下半部分是隐藏的,需要通过点击高级按钮将其显示出来。选中链接至文件系统中的文件并通过浏览对话框指定要添加的图片路径。最后在文件名一栏输入图片的文件名并点击完成,将图片添加到项目。下面只须在startApp()中通过如下代码装载图片并通过信息框将其显示出来即可:


Image logo = null;
try {
 logo = Image.createImage("/logo.png");
}catch (IOException e) {}
Alert splashScreen = new Alert(null, "郎锐2004年作\n版权所有(c)\n2004–2005", logo, AlertType.INFO);
splashScreen.setTimeout(4000); // 延迟4秒




图2 图3 图4 图5


  在持续显示图2四秒后进入角色选择界面(图3):


choosePieceScreen = new ChoosePieceScreen(this);
Display.getDisplay(this).setCurrent(splashScreen, choosePieceScreen);


  此任务在ChoosePieceScreen类中实现,主要的功能有对角色图标的装载显示、对选定角色的确认等。在其构造函数中首先指定当前界面为列表选择方式,然后通过append()将装载的图象与相应的列表文字建立关联。最后,为了响应用户的输入选择还必须调用setCommandListener()来检测按键事件的发生,并在commandAction()方法中实现对选定角色的确认:


super("请选择:", List.IMPLICIT); // 设置列表选择
this.midlet = midlet;
append(CAT_TEXT, loadImage("/cat.png")); // 添加图象选项到列表
append(RABBIT_TEXT, loadImage("/rabbit.png"));
setCommandListener(this); // 侦听按键响应
……
public void commandAction(Command arg0, Displayable arg1) {
 if (arg0 == List.SELECT_COMMAND){
  // 检测是否为列表按键响应
  // 检测用户选中的选项
  boolean isPlayerCat = getString(getSelectedIndex()).equals(CAT_TEXT);     
  midlet.choosePieceScreenDone(isPlayerCat); // 进入游戏画面
 }
}


  这里是通过检测用户选择的列表项文字来判断玩家选择的是花皮猫还是流氓兔并通过变量isPlayerCat来标识,在choosePieceScreenDone()方法中新建一个GameScreen对象并将其作为当前显示界面来开始一局新的游戏。GameScreen类负责游戏界面的绘制,如对棋盘和双方棋子的绘制以及对光标移动的处理等工作。

  游戏界面编程

  对弈游戏最主要的界面就是棋盘与棋子的绘制。这首先要根据屏幕大小计算棋盘网格间距和棋子的大小:


screenWidth = getWidth();// 获取屏幕大小
screenHeight = getHeight();
if (screenWidth > screenHeight) {// 计算网格大小
 boardCellSize = (screenHeight – 2) / 3;
 boardLeft = (screenWidth – (boardCellSize * 3)) / 2;
 boardTop = 1;
}else{
 boardCellSize = (screenWidth – 2) / 3;
 boardLeft = 1;
 boardTop = (screenHeight – boardCellSize * 3) / 2;
}


  绘制棋盘时,首先用背景色清空整个画布然后再分别按行列绘制出黑色网格即可:


g.setColor(WHITE);
g.fillRect(0, 0, screenWidth, screenHeight);
g.setColor(BLACK);
for (int i = 0; i < 4;i++) {
 g.fillRect(boardLeft, boardCellSize*i+boardTop,(boardCellSize*3)+2,2);
 g.fillRect(boardCellSize * i + boardLeft, boardTop, 2, boardCellSize * 3);
}


  棋子的绘制可以通过在指定位置显示装载的图象来实现。例如,对于花皮猫棋子的绘制可按如下代码先装载预先准备好的图象(大小须与网格相匹配)然后再调用drawImage方法在指定位置绘制。对于流氓兔棋子的绘制只需更改待装载的图象即可:


private void drawCat(Graphics g, int x, int y) {
 Image image = null;
 try {// 装载图象
  image = Image.createImage("/cat.png");
 }catch (Exception e) {}
 g.drawImage(image, x + 1, y + 1, 0); // 在指定位置绘制图象
}


  至于对移动光标的处理,可以先在将要移动到的网格内侧绘制一个新的、四边与棋盘网格紧密相连的黑色矩形框,然后再在原网格位置用原网格背景进行重绘以擦除上次绘制的光标痕迹。在擦除旧光标痕迹时首先需要判断该位置是空白还是绘制有棋子图案,并根据判断结果绘制白色矩形或是重新装载当前显示的棋子图象。图4给出了几个回合后的游戏截图,只要游戏没有结束,上述绘制模块将会多次反复调用执行。如果程序的智能控制部分判断出游戏已经结束并给出胜负结果,则不再显示棋盘界面而是通过下面这段代码以特定的字体在白色画布上绘制出当前战绩(如图5所示)。


Font font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM); // 设置字体
int strHeight = font.getHeight();
int statusMsgWidth = font.stringWidth(statusMsg);
int tallyMsgWidth = font.stringWidth(tallyMsg);
int strWidth = tallyMsgWidth;
if (statusMsgWidth > tallyMsgWidth)
strWidth = statusMsgWidth;
int x = (screenWidth – strWidth) / 2; // 计算字符绘制位置
x = x < 0 ? 0 : x;
int y = (screenHeight – 2 * strHeight) / 2;
y = y < 0 ? 0 : y;
g.setColor(WHITE); // 白色清空画布
g.fillRect(0, 0, screenWidth, screenHeight);
g.setColor(BLACK); // 黑色显示信息
g.drawString(statusMsg, x, y, (Graphics.TOP | Graphics.LEFT));
g.drawString(tallyMsg, x, (y + 1 + strHeight), (Graphics.TOP | Graphics.LEFT));


  在显示此界面时,如果用户按下退出或开始键,则在commandAction方法中将通过如下代码分别执行程序退出处理或是重新开始下一局新的游戏:


if (arg0 == exitCommand) // 退出
 midlet.quit();
else if (arg0 == newGameCommand) // 开始游戏
 initialize();



  人工智能的实现

  如果说前面介绍的框架是骨骼,界面是皮肉的话,那么接下来将要介绍的人工智能部分则可以说是整个程序的灵魂了。它将进行对弈双方落子的合法性检测、计算机行棋的智能计算、游戏结束检测以及对胜负结果的判定等工作。以上这些都需要有合理的设计才能实现较高的游戏运行效率。考虑到游戏规则始终是围绕双方棋子的排列形状来进行的,因此可以把棋盘网格作为主要因素进行设计。按从左到右,从上到下的次序从0开始依次对棋盘的9个网格进行编号,可以得出如下几组获胜条件:0,1,2;3,4,5;6,7,8;0,3,6;1,4,7;2,5,8;0,4,8;2,4,6。只要有一方有三颗棋子的位置符合其中任何一组即可认定该方获胜(读者可以在纸上验证一下)。在程序实现过程中以WINS数组记录上述几种获胜条件,并在每一次行棋完毕后进行比对,以判断游戏是否有获胜方产生。限于篇幅,下面主要对计算机行棋思路的人工智能设计进行介绍。

  首先明确计算机的对弈目的:获胜,如果暂时无法获胜则阻止选手获胜,如果双方都暂时无法获胜则可以下一些"随手棋"。在计算出合适的下子位置后将其添加到己方的行棋记录(打谱)以备后用。由此可以写出如下代码:


int move = getWinningComputerMove();//如能立即获胜则在获胜位置下子
if (move == -1) {
 //如选手即将获胜则在选手将获胜的位置下子
 move = getRequiredBlockingComputerMove();
 if (move == -1) // 如双方均暂时无法获胜则下随手棋
  move = getRandomComputerMove();
}
computerState |= bit(move); // 当前计算机占用的所有位置


  其中,getWinningComputerMove方法通过对所有可能下子位置(即尚未落子的网格)的枚举,智能判断计算机下一步走到哪里才能获胜:


int move = -1;
for (int i = 0; i < 9;++i) {
 if (isFree(i) && isWin(computerState | bit(i))) {
  move = i; // 找到获胜位置时中断
  break;
 }
}


  如果循环完毕仍没有找到获胜位置则表示目前己方暂无法获胜,需要进一步调用getRequiredBlockingComputerMove方法来计算下一回合对方有无获胜的可能,其实现代码与getWinningComputerMove完全类似,只是以选手的行棋记录playerState替代计算机的行棋记录computerState而已。以上寥寥数行代码即构成了计算机对弈算法的人工智能核心部分,显然人工智能在实现上并没有想象的那么复杂与困难。

  小结

  通过本系列文章的介绍,陆续将J2ME手机应用程序的一般开发过程向读者作了一个较为系统和全面的介绍。尤其是本篇对图形化手机游戏的介绍相信一定对读者有不同程度的启发作用,而且本文所述程序框架完全是通用的,读者只需在此基础之上重新设计游戏剧本即可实现类似的手机游戏如"华容道"、"俄罗斯方块"等。本系列文章开发环境为:

  Windows 2000 Professional + SP4;
  Java2SDK 1.5.0;
  J2ME Wireless ToolKits 2.1;
  SonyErisson J2ME SDK(WTK 1.0.4);
  SonyErisson T628;
  Eclipse 3.0.1-win32;
  EclipseMe 0.5.5;
  NLpack-eclipse-SDK-3.0.x-win32

2005年03月25日

  这是我从1月6日开始主持天极网论坛嵌入式开发版以来第一次发表文章,加上以前琐碎的文章共计30篇。研究的越多就越感觉自己懂的太少,其实在驱动开发方面我还是个菜鸟,我是想再次抛砖引玉,让做驱动有N年经验的人奉献一点出来,让大家减少一些研究驱动源码而又缺少注释所带来的痛苦。

  我想即使读者看过微软的关于驱动开发的培训教材和CE帮助文档中的驱动部分,头脑中仍然一片茫然。要想真正了解驱动程序必须结合一些驱动程序源码,在此我以串口驱动程序(COM16550)中初始化过程为线索简单讲一讲驱动开发的基础知识。

  Windows CE下的串口驱动程序能够处理所有I/O行为类似串口的设备,包括基于16450、16550 UART(通用异步收发芯片)的设备和一些采用DMA的设备,常见的有9针串口、红外I/O口、Modem等。在%_WINCEROOT%\Public\Common\OAK\Drivers\Serial目录下,COM_MDD2子目录包含新的串口驱动MDD层函数代码。COM16550子目录包含串口驱动PDD层代码。SER16550子目录包含的一系列函数专用于控制与16550兼容的UART,这样PDD层的主要工作就是调用SER16550中的函数。还有一个ISR16550子目录包含的是串口驱动程序专用的可安装ISR(中断服务例程),而很多硬件设备驱动程序采用CE默认的可安装ISR giisr.dll。一般串口设备相应的注册表设置例子及意义如下:


[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial_1]



意义
“SysIntr”=dword:13 串口1的中断ID为十进制13
“IoBase”=dword:02F8 串口1的IO空间首地址为十六进制2F8
“IoLen”=dword:8 串口1的IO空间长度为8个字节
“DeviceArrayIndex”=dword:0 串口1的索引,是1的由来
“Order”=dword:0 串口1驱动的加载顺序
“DeviceType”=dword:0 串口1的设备类型
“DevConfig”=hex: 10,00 …. 串口1在与Modem设备通讯时的配置,如波特率、奇偶校检等
“FriendlyName”=”COM1:” 串口1在拨号程序中显示的名字
“Tsp”=”Unimodem.dll” 串口1 被用于与Modem设备通讯的时候要加载的TSP(TAPI Service provider)DLL
“Prefix”=”COM” 串口1的流接口的前缀
“Dll”=”com16550.Dll” 串口1的驱动程序DLL


  SysIntr由CE在文件Nkintr.h中预定义,用于唯一标识中断设备。OEM可以在文件Oalintr.h中定义自己的SysIntr。常见的预定义SysIntr有SYSINTR_NOP(中断只由ISR处理,IST不再处理),SYSINTR_RESCHED(重新调度线程),SYSINTR_DEVICES(由CE预定义的设备中断ID的基值),SYSINTR_PROFILE、SYSINTR_TIMING、SYSINTR_FIRMWARE等都是基于SYSINTR_DEVICES定义的。IoBase是串口1的IO地址空间的首地址,IoLen是IO空间的大小。IO地址空间只存在于x86平台,如果在其它平台硬件寄存器必须映射到物理地址空间,那子键的名称为MemBase和MemLen。在x86平台更多硬件的寄存器由于IO空间的局限也映射到物理地址空间。DeviceArrayIndex是设备的索引,用于区分同类型的设备。Prefix是流驱动程序的前缀,当应用程序调用CreateFile函数传递COM1:参数时,文件系统负责与串口驱动程序通信,串口驱动程序是在CE启动时由device.exe加载的。

  下面从MDD层函数COM_Init开始探索串口驱动的初始化过程。COM_Init是在串口设备被检测后由设备管理器device.exe调用的,主要的作用是初始化设备,它的唯一参数Identifier是由device.exe传递的,其类型是一个字符串指针,字符串的内容是HLM\Drivers\Active\xx,xx是一个十进制数(device.exe会跟踪系统中每个驱动程序,把加载的驱动程序记录在Active键下)。

  COM_Init先分配一个HW_INDEP_INFO结构体,这个结构体是独立于串口硬件的头信息(MDD、PDD、SER16550都包含自己独特的结构体,具体的结构体定义请参见串口驱动源码),分配之后再初始化结构体中每个成员,初始化结构体后调用 OpenDeviceKey((LPCTSTR)Identifier)打开HLM\Drivers\Active\xx\Key包含的注册表路径,在这里路径一般为HLM\Drivers\BuiltIn\Serial,即串口的驱动程序信息在注册表中所处的位置。COM_Init接着在HLM\Drivers\BuiltIn\Serial下查询DeviceArrayIndex、Priority256的值,Priority256指定了驱动程序的优先级,如果没有就用默认的优先级。接下来调用GetSerialObject(DeviceArrayIndex),这个函数由PDD层定义,返回HWOBJ结构体,这个结构体主要包含PDD层和SER16550定义的函数的指针。

  也就是说MDD通过调用这个函数才能调用底层实现的函数。接下来的大多数工作都是调用底层函数实现初始化。第一个调用的底层函数SerInit主要设置由用户设置的硬件配置,例如线路控制、波特率。它调用Ser_GetRegistryData函数得到保存在注册表中的硬件信息,Ser_GetRegistryData在内部调用系统提供的DDKReg_GetIsrInfoDDK和DDKReg_GetWindowInfo函数得到在HLM\Drivers\BuiltIn\Serial下保存的IRQ、SysIntr、IsrDll、IsrHandler、IoBase、IoLen。IRQ是逻辑中断号,IsrDll表示当前驱动程序的可安装ISR所在的DLL名称,IsrHandler 表示可安装ISR的函数名称。

  在这里顺便提一下可安装ISR,读者在我以前发表的关于OAL的文章中可以了解到OEM在OEMInit函数中关联IRQ和SysIntr,当硬件设备发生中断时,ISR会禁止同级和低级中断,然后根据IRQ返回关联的SysIntr,内核根据ISR返回的SysIntr唤醒相应的IST(SysIntr与IST创建的Event关联),IST处理中断之后调用InterruptDone解除中断禁止。在OEMInit中关联的缺点是一旦编译了CE内核后就无法添加这种关联了,而一些硬件设备会随时插拔或者共享中断,要关联这样的硬件设备解决方法就是可安装ISR,可安装ISR专用于处理指定的硬件设备发出的中断,所以如果硬件设备需要可安装ISR必须在注册表中添加IsrDll、IsrHandler。多数硬件设备采用CE默认的可安装ISR giisr.dll,格式如下:


“IsrDll”=”giisr.dll”

“IsrHandler”=”ISRHandler”


  如果一个硬件驱动程序需要可安装ISR而开发者又不想自己写一个,那么可以利用giisr.dll来实现。除了在注册表中添加如上所示外,还要在驱动程序中调用相关函数注册可安装ISR。伪代码如下:


g_IsrHandle = LoadIntChainHandler(IsrDll, IsrHandler, (BYTE)Irq);

GIISR_INFO Info;

PHYSICAL_ADDRESS PortAddress = {PhysAddr, 0};

TransBusAddrToStatic(BusType, dwBusNumber, PortAddress, dwAddrLen, &dwIOSpace, &(PVOID)PhysAddr)

Info.SysIntr = dwSysIntr;

Info.CheckPort = TRUE;

Info.PortIsIO = (dwIOSpace) ? TRUE : FALSE;

Info.UseMaskReg = TRUE;

Info.PortAddr = PhysAddr + 0×0C;

Info.PortSize = sizeof(DWORD);

Info.MaskAddr = PhysAddr + 0×10;

KernelLibIoControl(g_IsrHandle, IOCTL_GIISR_INFO, &Info, sizeof(Info), NULL, 0, NULL);


  LoadIntChainHandler函数负责注册可安装ISR,参数1为DLL名称,参数2为ISR函数名称,参数3为IRQ。TransBusAddrToStatic函数在后面讲。如果要利用giisr.dll作为可安装ISR,必须先填充GIISR_INFO结构体,CheckPort=TRUE表示giisr要检测指定的寄存器来确定当前发出中断的是否是这个设备。PortIsIO表示寄存器地址属于哪个地址空间,FALSE表示是内定空间,TRUE表示IO空间。UseMaskReg=TRUE表示设备有一个掩码寄存器,专用于指定当前设备是否是中断源,也就是发出中断,而MaskAddr表示掩码寄存器的地址。如果对Info.Mask赋值,那么PortAddr表示一个特殊的寄存器地址,这个寄存器的值与Mask的值&运算的结果如果为真,则证明当前设备是中断源,否则返回SYSINTR_CHAIN(表示当前ISR没有处理中断,内核将调用ISR链中下一个ISR),如果UseMaskReg=TRUE,那么MaskReg寄存器的值与PortAddr指定的寄存器的值&运算的结果如果为真,则证明当前设备是中断源。

  函数SerInit接着调用函数Ser_InternalMapRegisterAddresses转换IO地址并且映射地址,Ser_InternalMapRegisterAddresses在内部调用系统提供的HalTranslateBusAddress(Isa, 0, ioPhysicalBase, &inIoSpace, &ioPhysicalBase)函数将与总线相关的地址转换为系统地址,参数1为总线类型,参数2为总线号,参数3为要转换的地址(PHYSICAL_ADDRESS类型,实际是LARGE_INTEGER型),参数4指定寄存器地址属于IO地址空间还是物理地址空间,参数5返回转换后的物理地址。观察HalTranslateBusAddress的源码得知如果是在x86平台,这个函数除了把参数3赋给了参数5其余什么都没有做,而非x86平台将inIoSpace的值置为0,表示一定是物理地址。在调用HalTranslateBusAddress前要确定从注册表中得到的寄存器地址到底是属于哪个地址空间的,例如:


ULONG inIoSpace = 1; ///1表示是IO空间

PHYSICAL_ADDRESS ioPhysicalBase = {iobase, 0}; ///相当于ioPhysicalBase.LowPart = iobase


  在地址转换后就要将转换后的地址映射到驱动程序(一般IST和应用程序一样运行在用户模式)能够访问的虚拟地址空间(0×80000000以下)和ISR能够访问的静态虚拟地址空间中(0×80000000以上)。例如:


////如果地址属于物理地址空间

ioPortBase = (PUCHAR)MmMapIoSpace(ioPhysicalBase, Size, FALSE);
TransBusAddrToStatic(Isa, 0, ioPhysicalBase, Size, &inIoSpace, ppStaticAddress);


  MmMapIoSpace函数负责将物理地址映射到驱动程序能够访问的虚拟地址空间中,通过源码分析MmMapIoSpace在内部分别调用:


pVirtualAddress =VirtualAlloc(0, SourceSize, MEM_RESERVE, PAGE_NOACCESS);

VirtualCopy(pVirtualAddress, (PVOID)(SourcePhys >> 8), SourceSize, PAGE_PHYSICAL | PAGE_READWRITE |
(CacheEnable ? 0 : PAGE_NOCACHE));


  VirtualAlloc分配一块和MemLen一样大小的虚拟地址空间,因为参数1为0,所以内核自动分配。一般MemLen小于2MB,所以会在应用程序的地址空间中分配。VirtualCopy负责将硬件设备寄存器的物理地址与VirtualAlloc分配的虚拟地址做一个映射关系,这样驱动程序访问PvirtualAddress实际上就是访问第一个寄存器。因为硬件设备寄存器的物理地址一定是在512MB(CE支持RAM的最大值)以上,所以除了最后的参数要加PAGE_PHYSICAL外,第二个参数物理地址也要右移8位(或者除以256)。

  映射硬件寄存器当然PAGE_NOCACHE是必须加的。TransBusAddrToStatic函数负责将物理地址映射到ISR能够访问的静态虚拟地址空间中,当出现中断共享时,ISR要负责访问硬件设备的某一个寄存器来判断中断源,所以将寄存器的物理地址映射到静态虚拟地址空间中是必要的(ISR只能访问静态的虚拟地址空间)。所谓静态虚拟地址空间是指在OEMAddressTable中定义的虚拟地址空间(当然是0×80000000以上)。在x86平台一般这个表只定义RAM的物理地址与虚拟地址对应关系,而硬件设备的寄存器地址并不在该表中定义,所以如果要创建一块静态的虚拟地址空间供ISR访问,必须在此之前调用CreateStaticMapping函数在0xC4000000到0xE0000000虚拟地址空间中分配。TransBusAddrToStatic函数在内部就是调用了CreateStaticMapping函数。注:硬件设备的寄存器地址也可以在OEMAddressTable中定义。


////如果地址属于IO空间

ioPortBase = (PUCHAR)ioPhysicalBase.LowPart;
*ppStaticAddress=ioPortBase


  这种情况只属于x86平台,是IO空间就可以直接访问,即使是用户模式。

  SerInit函数接着初始化SER_INFO结构体成员,之后调用SL_Init函数,这个函数在ser16550中定义,负责初始化SER16550_INFO结构体,在这个结构体中保存串口8个寄存器的地址。SerInit函数执行完毕后COM_Init函数创建接收缓冲区,然后调用StartDispatchThread函数初始化中断并且创建IST。StartDispatchThread函数在内部调用InterruptInitialize函数关联SysIntr和Event,然后调用InterruptDone函数告诉内核当前串口可以中断处理,接着调用CreateThread函数创建IST线程。(over吧,再往下说就和串口硬件有关了,看多了没注释的代码我也烦!!)

2005年02月19日

  摩托罗拉A6288、388型手机的登场,伴随着一个亮点:自身带有KJava虚拟机(KVM),能够通过多种方式下载且能够运行用户用KJava编写的符合MIDP1.0规范的应用程序。后来,又有多款手机支持KJava。实际上,KJava不仅能够为A6288等手机编写应用程序,而且还可以为其它一些移动信息设备编写应用程序。这类嵌入式程序和一般的Java程序相比,有它的特殊之处,本文将对KJava及其应用进行介绍。

  1.KJava简介

  Java语言最初是为嵌入式系统设计的一项产品,在Java 2中为了区分各种不同的应用,又细分成了Java 2 Enterprise Edition(J2EE)、Java 2 Standard Edition(J2SE)和Java 2 Micro Edition(J2ME)三种版本,其中J2ME又称作KJava。

  在J2SE中,它定义了Java规范的核心类函数库(即Java.*)和扩展类函数库(即Javax.*),它主要定位在客户端的应用程序。J2EE主要定位于服务器端的应用程序,它除了支持J2SE所定义的核心类函数库之外,还增加了一些扩展函数类库,如支持Serverlet/JSP的Javax.servlet.*等。J2ME只支持J2SE所定义的核心函数类库的一部分,此外,在J2ME中还增加了一些支持嵌入式系统的扩展类函数库,如Javax.microedition.*等。

  同样是嵌入式设备,它们在运算能力、电力供应等方面还是有很大的差别。Connected Limited Device Configuration(CLDC)规范描述的就是那些运算能力有限、电力供应有限的嵌入式设备,如手机等;而Connected Device Configuration(CDC)规范则描述的是像电视机顶盒这样运算能力较强、电力供应充足的系统。J2ME分别支持这两种不同的配置。在同一种配置下,J2ME又通过Profile来定义与特定嵌入式设备相关的扩展类函数库。

  在传统的Java环境中,为了防止程序在传送途中被篡改以及其它一些安全上的考虑,当程序被类别载入器载入后,紧接着要进行Byte Code审核,审核通过以后才允许Java虚拟机执行它。这一操作在PC机上执行从速度上来看没有什么问题,但是在CLDC所描述的这类系统中,要想作完全相同的处理,从处理能力和速度上来看就显得有些力不从心了。为了解决这个问题,程序设计人员需要在程序设计结束之后额外再多做一件事:预先审核。通过预先审核,会在最终的类文件中加入一些特殊的符号,当该程序下载到目标平台上去执行时,可以以较快的速度完成审核操作。

  2. Motorola SDK

  下面以摩托罗拉A6288型手机为例来具体讲解KJava的程序设计。在摩托罗拉A6288中使用了两颗CPU,一颗是Dragon Ball VZ 33MHz,用于个人数字处理,另外一颗用于通讯的处理。系统为用户预留了约1M的内存空间,支持符合MIDP 1.0规范的KJava应用程序。我们可以到摩托罗拉的官方网站去下载开发工具:CodeWarrior(试用版),下面的内容就是基于这一开发工具。

  在CodeWarrior中,它包含了摩托罗拉的SDK,它实现了CLDC和MIDP 1.0。它所实现的CLDC类库有Java.io.*、Java.lang.*、Java.util.*和Javax.microedition.io.*,实现的MIDP类库有Javax.microedition.lcdui.*、Javax.microedition.rms和Javax.micromedition.midlet。

  我们在PC环境下编写的嵌入在浏览器中的Java程序叫做Applet,编写的程序必须要从Applet类扩展自己的类。而为手机这类移动信息设备编写的KJava程序叫做MIDlet,程序必须要从MIDlet类扩展自己的类。一个MIDlet程序具备如下的典型结构:


public class HelloWord extends MIDlet
{
 HelloWord()
 {……}

 public void startApp()
 {……}

 public void pauseApp()
 {……}

 public void destroyApp(boolean unconditional)
 {……}
}


  当程序被启动时,startApp()被系统调用。(当程序刚开始运行时有启动过程,程序被暂停后也可以被再次启动)。当程序被暂时停止运行时,pauseApp()被调用。当程序执行结束时destroyApp()被调用。我们可以根据实际情况在各函数中进行相应的处理。

  在摩托罗拉SDK中没有AWT或者SWING,因为它们的实现会耗费太多的资源,摩托罗拉SDK只是在Javax.microedition.lcdui中实现了基于LCD的一些比较简单的设计用户界面的功能。SDK中定义了各种Displable类(如Form),程序中当前显示的画面必须是某个Displable的实例,在该实例中可以再放置按钮、文本编辑框、单选框等UI。

  3. 举例

  下面是用KJava编写的一个可以在A6288型手机上运行的简单的例子。具体程序如下:


import Java.io.*;
import Javax.microedition.lcdui.*;
import Javax.microedition.midlet.*;

public class HelloWorld extends MIDlet implements CommandListener
{
 private MainCanvas myCanvas;
 private Display myDisplay;
 private Command c1,c2,c3;

 HelloWorld()
 {
  myCanvas=new MainCanvas();
  myCanvas.addCommand(c1=new Command(“First”,Command.SCREEN,1));
  myCanvas.addCommand(c2=new Command(“Second”,Command.SCREEN,1));
  myCanvas.addCommand(c3=new Command(“Third”,Command.SCREEN,1));
  myCanvas.setCommandListener(this);
  myDisplay = Display.getDisplay(this);
  myDisplay = Display.getDisplay(this);
 }

 public void startApp() throws MIDletStateChangeException
 {
  myCanvas.setUp(“first”);
  myDisplay.setCurrent(myCanvas);
 }

 public void pauseApp() { }

 public void destroyApp(boolean unconditional) { }

 public void commandAction(Command c,Displayable d)
 { myCanvas.setUp(c.getLabel()); }

 class MainCanvas extends Canvas
 {
  String ts;

  MainCanvas()
  {
   super();
   ts=new String(“first”);
  }

  public void setUp(String s)
  { ts=new String(s); }

  public void paint(Graphics g)
  {
   g.setColor(0xFFFFFF);
   g.fillRect(0, 0, getWidth(), getHeight());
   g.setColor(0);
   g.drawString(“Current is the “+ts,getWidth()/2,60,Graphics.HCENTER | Graphics.TOP);
  }
 }
}


  程序运行后,可以根据用户选择的不同菜单项显示不同的内容。

2005年02月18日

       高通的BREW平台是一种为无线设备提供开放式标准平台的瘦应用程序执行环境,是无线应用程序开发、设备配置、应用程序发布以及计费和支付的完整端到端解决方案的一部分。完整的BREW解决方案包括面向开发者的BREW SDK ™(软件开发包)、面向设备制造商的BREW应用程序平台和移植工具以及由运营商控制和管理的BREW分发系统(BDS)。利用该系统,他们可以轻松地将开发者开发的应用程序投入市场并协调计费和支付过程。利用运营商基于BREW的服务,用户可以通过从运营商的应用程序下载服务器上无线下载应用程序来自定义手持设备。

   BREW是一种独立于空中接口的技术,可以运行在诸多网络中。但目前来讲,由于 CDMA2000 1X的技术在现有的技术标准中是在商业运行中最为稳定和成功,并经过多次验证。BREW在CDMA2000 1X网络中可以充分利用其高速的数据传输速率,为最终用户带来极具冲击力的用户体验。即:与芯片级电话功能的紧密集成,更高地展现声音和动画功能,用C/C++编写的应用程序,运行起来速度更快,BREW扩展技术支持用Java和Flash等制作的应用程序端对端的商业模式提供透明的计费和支付纪录,并可通达全球市场开发商,可以通过联通博路无线技术有限公司从高通和联通获得支持。

   由于BREW平台是独立于空中接口的技术,所以BREW与任何网络的结合都非常平滑。同时,它又是一个端到端的解决方案,特别注重满足整个价值链的所有要求。BREW平台包括针对运营商的BREW分发系统,针对开发商的SDK(软件开发工具包),针对终端厂商的移植工具包,和BREW计费系统。BREW使中国联通能够为其用户提供不断丰富的应用。到目前为止,中国联通基于BREW平台所开发的商用程序包括: Adventure(环球历险记)、Any Flash (安凯软件)、 City Online(都市在线)、 E4E Stock(股票)、 Hit Submarine(决战四大洋)、 Instant Weather(天气快报)、 Mobi Escape(莫比大逃亡)、 Suc Esc(星际生存)、Yao Ming Basketball(姚明篮球)等。

   为了应对移动数据的发展,推进无线电子商务等业务的发展,J2ME(Java 2 Micro Edition)即用于嵌入式系统的Java被引入无线领域。随着J2ME的应用,它为移动互联引入了一种新的模型,即允许手机可以从互联网上下载各种应用程序,并在手机创造可执行环境离线运行这些程序。由于定义了可执行程序下载的标准,并在手机上创立了可执行环境和程序开发语言,由此,在移动通信业第一次为软件开发商创造了巨大的商业机会,手机用户在得到丰富应用体验的同时,也大大提高了运营商的网络流量。

   J2ME的出现实际上是Java技术的回归,作为Java 2平台的一部分,J2ME与J2SE、J2EE一道,为无线应用的客户端和服务器端建立了完整的开发、部署环境。由于专门针对多样化的嵌入设备和消费电子设备,J2ME的结构与传统的编程序语言和规范有很大的不同,它是由配置(Configuration)、概要(Profile)和可选包(Optional Package)三要素构成。J2ME技术由一个虚拟机和一组API组成,这组API适合于为消费和嵌入式电子设备提供经过剪裁的运行环境。J2ME主要有两种组件:配置(configuration)和概要(profile)。J2EE的一个关键优点是它能同时为多种连网的便携机、台式机或其他工作站和服务器提供服务,无论运行在这些客户机上的软件是Java applets 、独立的Java程序、HTML浏览器还是本地的应用程序,它都可以同时支持。利用J2ME,这些企业系统也可以直接与各种电子设备进行通信。

   1999年,Sun公司将广为普及的Java技术架构进行了重新定义,J2ME作为Java技术在移动电话等小型设备的版本应运而生,它针对屏幕、电能和内存等资源有限的移动设备进行了优化和定义,为了解决无线设备多样化的矛盾,Sun依照各种设备的资源特性将J2ME技术架构分为Java Virtual Machine(JVM)、配置(configuration)和说明(profile)三层,然后再进一步细分,这使J2ME能够在每一类设备的限制下工作,而同时提供最低限度的Java语言功能性。

   Microsoft(r) .NET 是Microsoft XML Web services平台。 XML Web services允许应用程序通过Internet进行通讯和共享数据,而不管所采用的是哪种操作系统、设备或编程语言。 Microsoft.NET平台提供创建XML Web services 并将这些服务集成在一起之所需。对个人用户的好处是无缝的、吸引人的体验。

   从根本上讲,Microsoft (r) .NET是关于使技术为人们所用,而不是强制个人适应其计算机的限制。利用.NET,无论何时何地,您总能连接到您首选设备上的信息。利用.NET,您可以保护您的个人信息和企业数据,同时允许有您的授权的他人连接到这些信息。

   .NET体验:.NET体验是相当个性化的,集成的最终用户计算交互,它们通过新型智能设备提供的连接的 XMLWeb 服务来实现。从技术层面上讲,.NET体验就是XML Web服务与(在适当时)本地应用程序代码的结合。

   .NET框架:.NET框架是一个用于生成、部署和运行XML Web服务及其他应用程序的环境。它包含三个主要部分:公共语言运行库、框架类和ASP.NET。.NET框架压缩版是伴侣结构,它有一套编程接口,以供开发人员开发面向智能电话和PDA等移动设备的软件。

   .NET平台:.NET平台是一组开发工具和操作系统集,用来生成、公开和消费XML Web服务,通过智能设备实现个性化的集成Web。它由四部分组成:.NET框架和 Visual Studio.NET ,服务器结构,构造块服务,智能设备软件。
转贴自:http://www.51let.net/Article_Show.asp?ArticleID=451