移植s60应用程序第二版到第三版

移植s60应用程序第二版到第三版

From Forum Nokia Wiki

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第二版和第三版顺利编译。

    [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文件

    [edit] 第二版

    //导入环境变量头文件
    PRJ_EXPORTS
    projectenv.h
     
    PRJ_MMPFILES
     
    YourProject.mmp

    [edit] 第三版

    //导入环境变量头文件
    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] 目标文件类型

    [edit] 第二版
    TARGET                                  YourProject.app 
    TARGETTYPE                              app 
    UID                                     0x100039CE 0x0E9930B5 
    TARGETPATH                              /system/apps/YourProject
    [edit] 第三版
    TARGET                                  YourProject.exe 
    TARGETTYPE                              exe 
    UID                                     0x100039CE 0xE4DC9E88
    TARGETPATH                              /system/apps/YourProject

    在这里除了生成的目标类型有变化外,UID的范围也有变化。更多的UID信息 请参考 http://www.symbiansigned.com/.

    [edit] 资源文件

    [edit] 第二版
    RESOURCE                                YourProject.rss 
    RESOURCE                                YourProject_caption.rss
    [edit] 第三版
    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直接去掉即可。

    [edit] 第二版
    AIF  YourProject.aif ../aif projectaif.rss c24 context_pane_icon.bmp context_pane_icon_mask.bmp list_icon.bmp list_icon_mask.bmp
    [edit] 第三版

    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等,通常情况下不用对这些选项做额外的设置。


    [edit] 编译运行

    完成以上的步骤以后我们就可以进入到不同的项目定义文件组通过命令行或者用 vs.2003,carbide等ide 导入项目定义文件 编译和生成目标平台代码了。没有啥意外的话应该可以顺利通过编译,如果希望你的应用程序顺利的在第三版的设备上运行可能还需要一些细微的调试工作。

     
<script type=text/javascript> if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); } </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值