S60第一版和第二版编译器使用的是gcc for ARM,而第三版版本使用的编译器是支持ABI标准的RVCT 所以造成了第二版和第三版二进制格式不兼容,另外第三版(symbian9.0)采用了新的安全模型导致应用程序的目录结构也有所变化.所以在s60软件 从第二版移植到第三版过程中程序的编译及部署需要做一些改变((幸运的是这种变化并不大,你的代码几乎不需要做改变)).本文记录了从s60第一版、第二 版移植到第三版的需要做的一些变化及步骤。
步骤一:移植的准备工作
在你的项目group目录下分别创建不同平台的组目录,不同的平台放置单独的项目定义文件,拷贝当前的项目定义文(.mmp,.blf )件到不同的组目录。 如果你的项目定义文件以前是在group目录下。在新的目录结构中不用忘记修改项目定义文件中的相对路径,通常情况下修改 '../' 为 '../../'。
为了实现不同版本之间的移植,推荐通过一个头文件存放各个版本的环境变量参数方便我们控制在不同版本之间的编译。生成不同的版本只需要修改头文件即可。 创建一个名为projectenv.h的头文件分别拷贝至各个项目组目录。
#ifndef PROJECTENV_H_
#define PROJECTENV_H_
//#define __S60__ 200
#define __S60__ 300
#ifdef __S60__
//do something
#else
//do somthing
#endif
#endif /*PROJECTENV_H_*/
此时你的group目录结构应该和下面的结构类似:
│
├─s60_2nd
│ bld.inf
│ YourProject.mmp
│ projectenv.h
│
├─s60_3rd
│ bld.inf
│ YourProject.mmp
│ projectenv.h
此时两个组目录都是s60第二版下项目定义文件的副本,剩下的工作就是在此基础上进行修改始本项目能够顺利在s60第二版和第三版顺利编译。
步骤二 :修改应用程序框架入口
S60第二版的以前应用程序都是以多态DLL的形式存在的,第三版应用程序则变成独立的可执行程序。所以从代码方面最大的变化就是应用程序的入口发生了变化。找到你程序框架的入口源文件,通常是YourProjectApp.cpp 修改后的示例如下:
#ifdef EKA2
#include <eikstart.h>
LOCAL_C CApaApplication* NewApplication()
{
return new CYourProjectApp();
}
GLDEF_C TInt E32Main()
{
return EikStart::RunApplication(NewApplication);
}
#else
EXPORT_C CApaApplication* NewApplication()
{
return new CYourProjectApp;
}
GLDEF_C TInt E32Dll( TDllReason )
{
return KErrNone;
}
#endif
步骤三:编写生成应用程序图标的makefile
第三版提供了新的加载图标的API,支持普通的位图图标和可缩放图标,位图文件(.bmp)编译成mbm文件,矢量图形(.svg)编译成.mif 文件。位图从老的MBM文件中加载,可缩放图标从MIF文件中加载。 第三版中使用MIFCONV工具对位图和矢量图进行编译,目前此工具不能整合在在项目编译的makefile中被调用,我们需要一单独的makefile 来调用MIFCONV工具来编译图形资源,这个makefile加入到bld.inf文件中被gnumakefile工具调用。
编辑icons_aif.mk拷贝至s60_3rd目录。这里给出icons_aif.mk文件的示例
# ==============================================================================
# Name : icons_aif.mk
# Part of :
# Description : This is file for creating .mbm file
# Version :
#
# ==============================================================================
ifeq (WINS,$(findstring WINS, $(PLATFORM)))
ZDIR=$(EPOCROOT)epoc32/release/$(PLATFORM)/$(CFG)/Z
else
ZDIR=$(EPOCROOT)epoc32/data/z
endif
TARGETDIR=$(ZDIR)/RESOURCE/APPS
ICONTARGETFILENAME=$(TARGETDIR)/YourProject.mbm
do_nothing :
@rem do_nothing
MAKMAKE : do_nothing
BLD : do_nothing
CLEAN : do_nothing
LIB : do_nothing
CLEANLIB : do_nothing
RESOURCE :
mifconv $(ICONTARGETFILENAME) /c24,1 ../aif/list_icon.bmp /c24,1 ../aif/context_pane_icon.bmp
FREEZE : do_nothing
SAVESPACE : do_nothing
RELEASABLES :
@echo $(ICONTARGETFILENAME)
FINAL : do_nothing
步骤四:编辑bld.inf文件
第二版
//导入环境变量头文件
PRJ_EXPORTS
projectenv.h
PRJ_MMPFILES
YourProject.mmp
第三版
//导入环境变量头文件
PRJ_EXPORTS
projectenv.h
PRJ_MMPFILES
//编译图像资源
gnumakefile icons_aif.mk
YourProject.mmp
步骤五:修改资源文件
修改主资源文件
在第三版中应用程序的主资源文件基本上没有大的变化,唯一的不同是你需要加入一个实现应用程序本地话的结构LOCALISABLE_APP_INFO。解决方案如下:
资源文件的头部加入以下代码:
...
//我们定义的环境变量头文件
#include <projectenv.h>
// Added for SVG-T icon support.
#if (__S60__ >= 203)
#include <appinfo.rh>
#endif
资源文件的尾部加入以下代码:
if (__S60__ >= 300)
RESOURCE LOCALISABLE_APP_INFO r_localisable_app_info
{
short_caption = qtn_app_caption_string;
caption_and_icon =
CAPTION_AND_ICON_INFO
{
caption = qtn_app_caption_string;
number_of_icons = 2;
icon_file = "//resource//apps//YourProject.mbm";
};
}
#endif
增加应用程序注册资源文件
第三版不再支持AIF文件,你必须创建一个名字为 <yourproject>_reg.rss的文件(以_reg.rss为后缀 )用来注册应用程序,包括应用程序的UID、启动选项、图标、标题等参数选项。 编辑yourproject_reg.rss 其内容如下
#include "YourProject.hrh"
#include <appinfo.rh>
#include <YourProject.rsg>
UID2 KUidAppRegistrationResourceFile
UID3 0x0E9930B5
RESOURCE APP_REGISTRATION_INFO
{
app_file="yourproject"; //可执行应用程序的名称
localisable_resource_file = "//resource//apps//yourproject";
localisable_resource_id = R_LOCALISABLE_APP_INFO;
embeddability=KAppNotEmbeddable;
newfile=KAppDoesNotSupportNewFile;
}
步骤六:修改项目定义文件 (.mmp)
以下列出第二版和第三版的几个必要的改变。
目标文件类型
第二版
TARGET YourProject.app
TARGETTYPE app
UID 0x100039CE 0x0E9930B5
TARGETPATH /system/apps/YourProject
第三版
TARGET YourProject.exe
TARGETTYPE exe
UID 0x100039CE 0xE4DC9E88
TARGETPATH /system/apps/YourProject
在这里除了生成的目标类型有变化外,UID的范围也有变化。更多的UID信息 请参考 http://www.symbiansigned.com.
资源文件
第二版
RESOURCE YourProject.rss
RESOURCE YourProject_caption.rss
第三版
START RESOURCE YourProject.rss
HEADER
TARGET YourProject.rsc
TARGETPATH resource/apps
END //RESOURCE
START RESOURCE yourproject_reg.rss
TARGET project_reg.rsc
TARGETPATH /private/10003a3f/apps
END //RESOURCE
应用程序信息文件
第三版不再支持aif文件,在.mmp文件中把 Aif直接去掉即可。
第二版
AIF YourProject.aif ../aif projectaif.rss c24 context_pane_icon.bmp context_pane_icon_mask.bmp list_icon.bmp list_icon_mask.bmp
第三版
AIF YourProject.aif ../aif projectaif.rss c24 context_pane_icon.bmp context_pane_icon_mask.bmp list_icon.bmp list_icon_mask.bmp
除此之外还有一些可选项,比如CAPABILITY,SECUREID,VENDORID,EPOCSTACKSIZE等,通常情况下不用对这些选项做额外的设置。
编译运行
完成以上的步骤以后我们就可以进入到不同的项目定义文件组通过命令行或者用 vs.2003,carbide等ide 导入项目定义文件 编译和生成目标平台代码了。没有啥意外的话应该可以顺利通过编译,如果希望你的应用程序顺利的在第三版的设备上运行可能还需要一些细微的调试工作。