这一课我们讲解mmp文件,pkg文件, 以及如何用makesis制作sis文件用来安装程序到手机上。
开始之前,有必要提一下Symbian OS程序的目录规范, 你可以把所有头文件,原文件,mmp文件,资源文件等都放到一个目录下, 但是为了更有效的使用,一般把源文件放在/src下, 头文件放在/inc, bld.inf,mmp文件放在/group, sis, pkg文件放在/sis下。
首先在group目录中找到Helloworldbasic.mmp文件, 它由一系列的属性组成:
Target   这个是目标文件名
TargetType 目标类型,也就是目标文件的扩展名, app代表这是一个图形界面的应用程序(application), 文字界面的那个helloworld就是exe 以后还会看到其他的扩展名如: dll, agt, prt等等
UID   这里有两个UID, 他们用来独特的识别我们的程序,所有的图形界面程序的第一个UID都是一样的:0x100039CE, 第二个是我们的程序独特的UID,需要从Symbian申请。 但是在开发阶段可以任意使用0x01000000-0x0ffffff这个范围.
TargetPath 目标文件在安装后的路径
SourcePath 源代码路径, 源代码文件可以存放在多个不同的目录里, 在编译的时候编译器会自动到这些目录寻找
Source 源代码文件
Resource 资源文件, 这个大概超出了本教程的范围,因为这部教程不会详细地将深入讲解如何写图形程序
UserInclude 用户头文件路径, 用于存放用户定义的头文件
SystemInclude 系统头文件路径
Library 这些是你的程序编译所需要的库文件
然后我们概述一下pkg文件, 打开Helloworldbasic.pkg,不难看出凡是以 ';' 开头的都是注释, &EN代表这里使用的语言是英语, 下面一行是应用程序信息#{"HelloWorldBasic"}是应用程序名称, 0x10005B91 是此程序的UID, 1,0,0是版本号.
下面这一行是你开发用的平台信息 0x101F7960代表Series60 v2.0, "0,0,0"是尚未使用的版本号,它必须是"0,0,0", {"Series60ProductID"} 是平台信息描述, 这个字符串将在用户试图安装程序到一个不兼容的平台上时出现.再下面是安装文件, 左边的是目标程序在你的机器上的路径,右边是设备上的路径,HelloWorldBasic.APP 是目标文件, HelloWorldBasic.rsc 是编译过的资源文件.
有了以上的基础,我们就可以编译sis文件了. 一共分为2步:
1. 进入到/group目录下, 输入bldmake bldfiles, 和以前讲过的作用一样, 然后: abld build thumb urel, "abld build"是编译命令, "thumb urel"是编译目标, 一般手机的格式都是thumb, 用命令行为windows编译的话,就可以用 abld build wins udeb (urel). "udeb" 代表debug build, "urel"代表release build, 前者用于开发,后者用于发行。
2. 进入/sis, 输入makesis Helloworldbasic.pkg, 然后Helloworldbasic.sis就被创建了。
下面就可以用蓝牙,或者usb等通讯手段将这个sis文件传送到你的symbian 手机上了. 安装,执行, 好运!:)
Symbian OS 开发初级手册 5 - Leave
leave (不知该怎么翻译,就先叫离开吧) 这个词我们在第二课提到过, 知道它是Symbain版本的异常处理。 这一课我们详细讲解它的意义和用法。 首先我们要明白为什么要离开? 当程序运行到一个地方无法正常继续的时候, 比如内存耗尽, 或者当前状态无法进行某个操作的时候我们不能简单的退出程序,或者忽略这些错误。 前者使得界面不够友好, 而后者可能导致不可估计的问题。 所以我们需要在这一点上离开。 让上一层的使用我们这个函数的代码去处理我们遇到的错误。 上一层代码可以根据但是的上下环境决定该如何处理这个错误。
离开的基本用法:
假设我们有一个函数提取一个数组的值:
TInt GetL(TInt aIndex)
{
if(aIndex < 0 || aIndex >= KArraySize)
  {
  User::Leave(KErrArgument);
  }
else
  {
  return iArray[aIndex];
  }
}
要使用这个函数, 我们可以:
TInt x, err;
TRAP(err, x = GetL(5);)
if(err != KErrNone)
{
//输出错误信息等等
}
...首先注意函数名,这是一条规范: 凡是有可能离开的函数,名称都要以L结尾。这包括
在函数实现中使用任何形式的Leave (Leave, LeaveIfNull, LeaveIfError等等)和可leave的函数, 而又没有TRAP掉他们的的函数。以上的GetL函数当aIndex不在合法范围内的时候就会leave, KErrArgument是其原因(错误的参数)。 使用GetL函数的时候我们可以使用TRAP宏来捕捉离开, 所以当GetL 离开的时候, 就会输出错误信息等等。 使用GetL的代码并不一定需要TRAP只要把他自己声明为可离开的函数就可以, 但是要保证终归这些函数要被TRAP掉。 图形界面程序的框架在程序入口处提供了TRAP所以我们可以使用离开而不用TRAP一些普遍性的问题(比如内存不足)。但是文字程序一般需要我们自己提供TRAP. 另外还有一点就是, TRAP这个宏必须在一个CTrapCleanup的实例被创建以后才可以使用。 文字Helloworld中使用了头文件commonframework, 在Examples/basics/commonframework目录下, 我们可以看到:
CTrapCleanup* cleanup=CTrapCleanup::New(); // get clean-up stack
TRAPD(error,callExampleL()); // more initialization, then do example
//TRAPD是TInt error; TRAP(error,callExampleL()); 的缩写版。
delete cleanup; // destroy clean-up stack
也就是说当你的进程中还没有CTrapCleanup实例的时候, 你需要创建它才可以使用TRAP,当你不再使用TRAP的时候就删除这个实例。有了离开这个基础,我们下一课就可以讲CleanupStack 和 二层构造的概念了。 之后大家就不会觉得Symbian 程序中实例的构造看起来很复杂了。