Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3506499
  • 博文数量: 1450
  • 博客积分: 11163
  • 博客等级: 上将
  • 技术积分: 11101
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-25 14:40
文章分类

全部博文(1450)

文章存档

2017年(5)

2014年(2)

2013年(3)

2012年(35)

2011年(39)

2010年(88)

2009年(395)

2008年(382)

2007年(241)

2006年(246)

2005年(14)

分类: 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
      #include 
      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 
       
      // 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文件,你必须创建一个名字为 _reg.rss的文件(以_reg.rss为后缀 )用来注册应用程序,包括应用程序的UID、启动选项、图标、标题等参数选项。编辑yourproject_reg.rss 其内容如下

      #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;
      	}

      步骤六:修改项目定义文件 (.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信息 请参考 .

      资源文件

      第二版

      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 导入项目定义文件 编译和生成目标平台代码了。没有啥意外的话应该可以顺利通过编译,如果希望你的应用程序顺利的在第三版的设备上运行可能还需要一些细微的调试工作。

      Retrieved from ""
      阅读(551) | 评论(0) | 转发(0) |
      给主人留下些什么吧!~~