分类: C/C++
2009-05-25 15:57:53
S60第一版和第二版编译器使用的是gcc for ARM,而第三版版本使用的编译器是支持ABI标准的RVCT 所以造成了第二版和第三版二进制格式不兼容,另外第三版(symbian9.0)采用了新的安全模型导致应用程序的目录结构也有所变化.所以在s60软件从第二版移植到第三版过程中程序的编译及部署需要做一些改变((幸运的是这种变化并不大,你的代码几乎不需要做改变)).本文记录了从s60第一版、第二版移植到第三版的需要做的一些变化及步骤。
Contents[] |
在你的项目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 #includeLOCAL_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
第三版提供了新的加载图标的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
//导入环境变量头文件 PRJ_EXPORTS projectenv.h PRJ_MMPFILES YourProject.mmp
//导入环境变量头文件 PRJ_EXPORTS projectenv.h PRJ_MMPFILES //编译图像资源 gnumakefile icons_aif.mk YourProject.mmp
在第三版中应用程序的主资源文件基本上没有大的变化,唯一的不同是你需要加入一个实现应用程序本地话的结构LOCALISABLE_APP_INFO。解决方案如下:
资源文件的头部加入以下代码:
... //我们定义的环境变量头文件 #include// Added for SVG-T icon support. #if (__S60__ >= 203) #include #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文件,你必须创建一个名字为
#include "YourProject.hrh" #include#include 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; }
以下列出第二版和第三版的几个必要的改变。
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信息 请参考 .
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 导入项目定义文件 编译和生成目标平台代码了。没有啥意外的话应该可以顺利通过编译,如果希望你的应用程序顺利的在第三版的设备上运行可能还需要一些细微的调试工作。