全局数据问题

1.简单介绍下dll.

   SymbianOS中的DLL主要有两类:共享库dll和多态dll.

   共享库的扩展名是dll,它还要发布头文件.h和导入库.lib.

   多态dll实现一个抽象接口.它可以具有.dll的扩展名,但通常会使用能够进一步表达dll本质的扩展名,如.app表示应用程序,.fep表示前端处理器,.mdl是一个识别器.

   SymbianOS中,dll的大小会被进一步优化,以节省ROM,RAM空间.

如:不支持dll的按函数名查找,只使用按序号连接的方式;

  在Windows平台,每个进程都有自己独立的DLL空间,不同进程装载同一个DLL,互相之间是独立的,只有在一个进程内,才是共享的。但是S60平台的设计是所有进程都共享同一个DLL空间.

2. "可修改全局数据" 指的是任何非常量的全局域变量或任何非常量的函数域静态变量,为了简略表示,Symbian通常将这类变量称为WSD,代表可写静态数据。

 

SymbianOS中的dll不支持可写的全局数据,或支持的不好.

    原因(1)全局数据是使用地址,不是使用从指针得出的偏移量访问.可能会重定位.

          (2)装载的同一个dll的不同的进程使用相同的地址访问dll的全局数据,可能会造成混乱.

          (3)每个支持可写静态数据的dll都需要一个最小4k的chunk.

    这些限制造成一些不方便,如singleton pattern.

3.在SymbianOS中的dll中可以使用的仅有的全局数据是:全局常量内建类型,或没有构造函数的类的全局常量数据.

   以下的全局数据可以使用:const TInt K=6;const TUid KUid={0x0FFFFFFF};

   以下的全局数据不可以使用:const TPoint KPoint(0,0);

 

   在向ARM目标机器构建时可能会产生如下错误信息:

   has initialised data       可能表示使用了静态类成员

   has uninitialised data   可能表示使用了全局可修改变量或trivial类

可以到D:/Symbian/7.0s/Series60_v21_C/Epoc32/release/armi/urel/应用程序名.APP.map文件中查找。

__data_start__=.  和  __data_end__=.  之间的内容  has   initialised data.
__bss_start__=.   和  __bss_end__=.  之间的内容  has uninitialised data.

 

4.SymbianOS提供了一种机制,线程局部存储(thread local storage,TLS),dll可以使用它基于每个线程管理可写的静态数据.该机制会在每个dll中为每个线程分配一个单独的可写的静态数据的机器字.对每个线程使用TLS进行全局静态数据访问是安全的,因为这避免了当DLL被载入到多个进程中时带来的复杂性.

TLS的关键是两个函数:
void Dll::SetTls(void*)

void* Dll::Tls()

出于扩展性考虑,通常会使用它存储 指向一个结构体或简单T类的指针, 而在其中封装所有的可写静态数据.

5.

 http://blog.csdn.net/Beover1984/archive/2005/10/13/502785.aspx

http://developer.symbian.com/china/support/code_clinic/clinic_april2008/index.jsp

http://wzcd2004.blog.163.com/blog/static/27892442200926113544382/

 

6. C语言工程移植到Symbian OS上注意如下几点:
    (1)、首先要考虑C语言和C++语言的混合编程问题,因为在UI层要以C++语言来设计,UI层中的代码无法被移植,必须结合平台上的UI设计方法来设计,而UI层中要实现的功能可以用C语言来实现,要考虑好哪些应该用C++来设计,哪些应该用C语言来设计,如果出现C语言中的代码调用C++中的代码(这种情况应该尽量避免),则该C语言的代码必须用C++来编译,用C++来编译的文件名最好以“CPP”为扩展名,在C++中引用C的代码是最好加上“extern “C” {}”.
2、在程序退出之前要调用CloseSTDLIB(),以释放所有缓冲,该函数在“reent.h”文件中;
3、在MMP文件中要加入“estlib.lib”,该LIB库是C标准语言的LIB库;
4、Symbian中的STDLIB并没有完全实现POSIX的全部标准,所以有些C库的函数要自己实现或用其它方法来替代;
5、在C语言工程中最好不要有可写的全局静态变量(Global Writeable Static Data),在有些手机版本中是不支持全局变量的,但可以有全局静态常量,对于全局指针常量注意要这样申明,例如:static const char* const,即要有两个“const”。如果有出现全局静态变量或静态常量,则在MMP文件中要加入“EPOCALLOWDLLDATA”标识,否则会出现编译错误。对于可写的全局静态变量有种处理方法是把所有全局变量放到一个STRUCT结构中,然后这个结构的指针用Dll::SetTls()和Dll::Tls()来存取,存在的问题是用C编译的代码中无法调用C++的这种方法,还有一种最笨的处理方法是把指针的值存入一个文件中;
6、在C++与C的交互接口中会存在如char*与TdesC之间的转换,可以这样转换,例如:
   把TDesC转换成char*:
    HBufC8* utf8TempText = HBufC8::NewLC(STRING_LENGTH);
              TPtr8 utf8Text(utf8TempText->Des());                                 
              CnvUtfConverter::ConvertFromUnicodeToUtf8(utf8Text,TDesCString);   
          Char*  cString = (char*)utf8Text.Ptr();
     把char*转换成TPtr:
    TPtr8 utf8Text((TText8*)cString,strlen(cString),strlen(cString));
         HBufC* ucs2TempText = HBufC::NewLC(utf8Text.Length()*2);
         TPtr ucs2Text(ucs2TempText->Des());  
         CnvUtfConverter::ConvertToUnicodeFromUtf8(ucs2Text,utf8Text);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值