初学S60,常见问题记录

最近开始学习S60,从搭建环境到第一个Helloworld程序出世,期间遇到了不少问题,再同事的帮助以及Google的强力支持下,逐一得到解决,下面逐一做一个记录。

1 出现“Cannot start ECMT Manager”错误提示框

                           

原因:在安装Symbian S60 3rd Edition FP1 SDK时,默认识别Jre5.0 而我机器上装的是比这个高的版本6.0

 

解决方法:打开<installation_path>\Epoc32\tools\ecmt\config\config.properties, 

可以看到其中一行是epdt.java.version.start=1.4.1,1.4.2,1.5,5.0

 

如果你装的是Jre6.0 则将此行修改为:

epdt.java.version.start=1.4.1,1.4.2,1.5,5.0,1.6,6.0

2 命令行编译步骤

      a、转到group所在的目录

      b、执行如下命令,生成abld.bat文件:

            bldmake bldfiles

      c、执行如下名称,启动make,编译生成文件:

            abld build winscw udeb

      d、调用epoc模拟器运行install目录下的对应文件。

 

      备注:

          ABLD build GCCE UREL is for release
       ABLD build GCCE UDEB is for debug on handset
       ABLD build WINSCW UDEB is for debug on emulator (i.e. Windows)

 

仔细阅读bldmake命令说明,它会干三件事情

1.       Creates the directory: \epoc32\build\absolute_path_to_bld.inf_file\

2.       Generates makefiles for the component into this directory

3.       Produces a batch file called abld.bat in the current directory.

 

abld buildabld export,makefile,...,final命令的集合,用来生成所有可能平台上的binary文件,常用的是winscw[运行在模拟器上]armv5[运行在实际的phone],它们编译的中间的文件统统在\epoc32\build\absolute_path_to_bld.inf_file\mmp_basename\[winscw or armv5]\[udeb or urel]下面,生成的binary文件在\epoc32\release\[winscw or armv5]\[udeb or urel]下面,可以用这样的命令编译特定平台的binary文件:abld build winscw udeb编译在模拟器上运行的debug文件。armv5版本的binary文件是用gcc/rcvt交叉编译器编译出来的,这些编译器都基于ARM公司的标准ABI

 

bldmakeabld会用到infmmp配置文件,inf文件有点儿类似solutionmmp相当于单个的project,具体的语义可以参考说明文档。第一天就跳过去吧!没有编译出来,很失败。

转到Carbide上面,通过import inf文件导入Example\Basics\HelloWorld项目,点击debug看到了模拟器上hello world的样子,但是怎么出来的仍然一头雾水。

 

下面用一个例子来逐一说明上述步骤及其所做的事情。

1.找到helloworldbasic文件夹的地址,
D:\ProgramFiles\Symbian\9.2\S60_3rd_FP1\S60Ex\HelloWorldBasic\group>

2、构建我们的例子,输入:
bldmake bldfiles
这一步会生成一个文件ABLD.BAT
3
、编译和链接,输入:
abld build wins udeb
这一步会生成供Series 60 调试模拟器使用的文件。
4
、运行,在命令行进入:
D:\ProgramFiles\Symbian\9.2\S60_3rd_FP1\Epoc32\release\winscw\udeb
这个目录含有刚生成的HelloWorldBasic.exe文件。然后输入:
HelloWorldBasic
此时会自动打开series 6.0的调试模拟器,同时还可发现在应用程序中多了一个HelloWorldBasic程序

下面简单介绍一下以上各步的含义:
当我们运行
bldmake bldfiles
这个命令时,会处理当前目录下的bld.inf文件,具体来说会执行以下处理过程:
1
、生成目录
D:\ProgramFiles\Symbian\9.2\S60_3rd_FP1\Epoc32\BUILD\ProgramFiles\Symbian\9.2\S60_3rd_FP1\S60Ex\HelloWorldBasic\group
2
、在这个目录下,生成一系列的Make文件,针对各种目标环境。比如VC7.MAKECW_IDE.MAKE等等。
3
、在当前目录下生成abld.bat文件,这个文件会在随后用到。可以查看该文件的内容。但是建议不要手工的更改它的内容。Bldmake命令也支持其他的命令行选项,可以直接输入bldmake来查看简要的介绍,还可以查看SDK文档了解详细信息。由bldmake处理bld.inf文件得到的abld.bat文件,使得abld命令可用。Abld.bat控制着构建一个项目的方方面面。Abld命令的语法非常地灵活,它拥有许多命令行选项,它们的组合涵盖了各种构建需求。最常用的组合,莫过于abld build abld clean 相关了。

当我们运行
abld build wins udeb
这个命令时,将为wins平台(即通常的VC++环境)生成一个debug版本的程序。具体来说,在
D:\ProgramFiles\Symbian\9.2\S60_3rd_FP1\Epoc32\release\winscw\udeb
下面各生成了一些文件比如HelloWorldBasic.exe文件。

再运行此exe文件就可以看到HelloWorldBasic的执行效果了。或者执行epoc,然后在“安装”目录下面就会看到此“HelloWorldBasic”程序的图标,点击即可运行。

 

 

 abld build”编译显示“nothing to do

下载了S60Carbide C++,安装过后就按照S60的说明文档测试安装环境,cdelloWorldBasic \group 下面,bldmake bldfiles, abld build; 出现以下错误

make -r  -f      "\Symbian\9.2\S60_3rd_FP1\EPOC32\BUILD\Symbian\9.2\S60_3rd_FP1\S60Ex\HelloWorldBasic\group\EXPORT.make" EXPORT VERBOSE=-s
Nothing to do

 

     解决办法:运行“Configure environment for WINSCW command line”即可, start->All Programs->Carbide C++ V2.0-> Configure environment for WINSCW command line

 

 

4  编译过程

 

                   

 

5  Symbian UI 架构分类

Symbian OSUI架构主要分成三种:

1. 传统的Symbian系统架构

2. 基于对话框的架构

3. 视图架构

 

下面将分开讨论三种架构的特点和优缺点:

1.传统的Symbian系统架构

                      

如图所示程序中框架类主要继承自Avkon FrameworkCAknApplication, CAknDocumentCAknAppui,另外容器类继承自CONECCoeControl

使用Carbide C++建立一个包含UI的工程,默认的配置中所使用的架构就是这个传统的Symbian系统架构。

其中,CAknApplicationS60应用程序的基类,主要存储应用程序的属性,比如,可以通过重写OpenIniFileLC()的方式存储.ini配置文件等。

CAknDocument为文档类的基类。

CAknAppUi负责处理各种事件,比如HandleCommandL()

CMyContainer中可以包含一个或多个控制控件,实现界面的交互,并负责窗体描画事件。

优点是:

 比较简单和清楚的框架,并且可以加入自定义的控制和交互,比较灵活。

缺点是:

 没有系统提供的视图的管理方式。

UIQ中与上述类对应的类是:

CQikApplicationCQikDocumentCQikAppUi

 

2. 基于对话框的架构

这种架构和第一种架构的区别是,使用了一个非模式窗体类CAknDialog来作为主窗体,窗体的设计可以在资源文件中定义,并且可以在不重新编译C++程序的前提下,通过改变资源文件的定义的方式,重新设计窗体。在实践中,这种架构的应用并不多。

     

 

3. 视图架构

                  

这种架构的应用最为广泛,在SDK中也有一个叫MyView的例子程序,结合上图仔细读懂这个例子,应该就会清楚很多。

与前两种架构所不同的是,视图类继承自CAknView,并且可以在运行时生成和添加多个视图,并由系统所提供的ViewServer进行管理,在制作稍微复杂一些,尤其是画面比较多的应用程序时,非常有用。但是在Carbide C++中并没有提供默认的工程向导模板,不过可以自己制作一个以方便将来使用。

需要注意的是,与前两种架构不同的是,CMyViewAppUi继承自CAknViewAppUi,他的功能同样是负责接收各种事件,并进行处理,而且可以在这个类中进行各种View的切换和更新激活视图。每个View有自己独立的IDCAknViewAppUi利用这个IDViewServer中注册相关的窗体,并调用不同的窗体,这种架构更面向对象,并且每个视图中封装了属于自己的数据和方法,实现了更灵活的应用。

 

6 "Des 16Align 18"错误

使用下面的代码,结果程序panic,报错“Des16Align 18”,

CDesCArray *itemList = new (ELeave) CDesCArrayFlat(3);

TBuf<32> item;

item.Format(KListItemFormat,  _L("first item"));  //here

itemList->AppendL(item); idx++;

 

究其原因:“when you pass strings to Format() you have to pass pointer to TdesC

修改如下就OK了:

CDesCArray *itemList = new (ELeave) CDesCArrayFlat(5);

       TBuf<32> item;

 

_LIT(KItem1, "item1");

item.Format(KFormat, &KItem1);

7 LISTBOX的显示问题

使用CeikTextListBox,不管使用代码动态创建或者使用资源文件创建,出来的ListBox底部都缺失一部分,如下图,其中左边的ListBox和右边的编辑框所指定的高度大小是一样的,但是显示结果缺大不一样。(3.1SDK

根据研究发现,可能是控件内部对显示高度做了处理,从而保证每一个item都能完整显示,如果设置listbox高度不是item高度的倍数,或者使item显示不完整,则就会缩小listbox的显示区域,从而保证所有item都能显示出来。

但是纳闷的是,SetExten后,获得控件的高度值显示,控件的高度不是实际看到的高度(优化后),而是优化前你所设置的高度。


这又造成一个问题,就是滚动条看起来比listbox的现实区域要大,如上图所示。

8  How do I create a non-window owning control?

 

Instead of calling CreateWindowL() when constructing the control,  call SetContainerWindow. Non window owning controls can be useful because they do not use up resources within the window server and make control management quicker, this means that a non-window owning control is good when you create a window/dialog that consists of several sub-controls. However, be aware that you do need a parent control to own the window.

 

This article applies to Symbian and P800, P802, P900, P908 and P910.

 

Draw之外进行绘制

有时候,需要在CcoeControl之上进行绘制,例如输出文字,或者绘制图形,此时有几个地方需要注意,否则程序会crash的,例如报WSERV 349之类的错误。

1、 所要进行绘制的控件,必须拥有窗口,也就是创建时采用了CreateWindowL函数,具体见上一问题。

2、 在任何绘制之前,先要激活Graphics Context,绘制完成之后必须去激活。其实,这里所说的“之前”不仅仅是调用Draw*系列函数之前,而是对GC进行任何操作之前,例如设置背景颜色、画笔颜色、字体等。也就说,在获得了GC之后的第一件事情就是激活它。

下面是一个示例代码:

void CActiveFaceAppView::DrawShapceOnFace()

    {

    TRect rect1 = this->Rect();    

    TRect rect (TPoint(0, rect1.Height() / 8), rect1.iBr);

   

    //active graphics context and clear

    CWindowGc &gc = SystemGc();

    RDrawableWindow *window = DrawableWindow();

    gc.Activate(*window);

 

    const TInt width = 36;

    const TInt step  = 1;

   

    static TPoint point(0, Rect().Height()/ 2);

    static TInt ratioX = 1;

    static TInt ratioY = 1;

   

    TRgb backColor = TRgb(149, 208, 208);

   

    //to avoid flash screen, use back color to override last rect

    gc.SetPenColor(backColor);

    gc.DrawRect(TRect(point, TSize(width, width)));

   

    point.iX += ratioX * step;

    point.iY += ratioY * step;

   

    if (point.iX + width > rect.Width() || point.iX < 0)

       {

       ratioX *= -1;

       }

 

    if (point.iY + width > rect.iBr.iY || point.iY < rect.iTl.iY)

       {

       ratioY *= -1;

       }

 

    //use new color and draw rectangel

    gc.SetPenColor(KRgbBlue);

    gc.DrawRect(TRect(point, TSize(width, width)));

 

    //deactivate the gc

    gc.Deactivate();

    }

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值