步骤一:移植的准备工作
在你的项目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第二版和第三版顺利编译。
[edit] 步骤二 :修改应用程序框架入口
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
[edit] 步骤三:编写生成应用程序图标的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
[edit] 步骤四:编辑bld.inf文件
//导入环境变量头文件
PRJ_EXPORTS
projectenv.h
PRJ_MMPFILES
YourProject.mmp
//导入环境变量头文件
PRJ_EXPORTS
projectenv.h
PRJ_MMPFILES
//编译图像资源
gnumakefile icons_aif.mk
YourProject.mmp
[edit] 步骤五:修改资源文件
[edit] 修改主资源文件
在第三版中应用程序的主资源文件基本上没有大的变化,唯一的不同是你需要加入一个实现应用程序本地话的结构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
[edit] 增加应用程序注册资源文件
第三版不再支持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;
}
[edit] 步骤六:修改项目定义文件 (.mmp)
以下列出第二版和第三版的几个必要的改变。
[edit] 目标文件类型
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
[edit] 应用程序信息文件
第三版不再支持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 导入项目定义文件 编译和生成目标平台代码了。没有啥意外的话应该可以顺利通过编译,如果希望你的应用程序顺利的在第三版的设备上运行可能还需要一些细微的调试工作。