标准C程序symbian编译总结(1)

来源:互联网 发布:linux 自动解压war包 编辑:程序博客网 时间:2024/05/29 11:03

内核SYMBIAN编译总结

1           无需按照symbian的命名规范来,包括数据类型,只需要按照标准的C来就可以。

即:short 无需非要用 Tint16;

2           包含的头文件,也仅需标准C的库文件,无需其他头symbian特定文件。需要在mmp文件中指定标准C:

SYSTEMINCLUDE   /epoc32/include /epoc32/include/libc/

LIBRARY          euser.lib estlib.lib

另外需要在退出dll的函数中调用一次:

#ifdef SYMBIAN_OS

CloseSTDLIB();

#endif

3           导出函数定义:一般先定义宏:

#define SYMBIAN_OS

 

#ifdef SYMBIAN_OS

#define API_IMPORT    IMPORT_C

#define API_EXPORT       EXPORT_C

#elif defined(WINDOWS)

#define API_IMPORT     __declspec(dllimport)

#define API_EXPORT     __declspec(dllexport) 

#else

#define API_IMPORT    

#define API_EXPORT    

#endif

其实在WINDOWS平台我们无需定义,我们可以使用DEF文件。这样我们可以定义如下形式:

#ifdef SYMBIAN_OS

#define API_IMPORT    IMPORT_C

#define API_EXPORT       EXPORT_C

#else

#define API_IMPORT    

#define API_EXPORT    

#endif

 

在头文件中声明导出函数使用API_IMPORT     一般头文件都要在(例如:my.h)

#ifdef __cplusplus

extern “C”

{

#endif

API_IMPORT void Fun1();

API_IMPORT int Fun2();

#ifdef __cplusplus

}

#endif

带有色彩部分的代码对所有平台都使用,声明为导出是C的函数;

 

在实现文件中定义导出函数使用API_EXPORT

#include “my.h”

API_EXPORT void Fun1()

{

        ………

}

 

4           Symbian OS 有的采用了EKA2那么该内核支持全局变量称为global WSD(Writable Static Data). 如果是其他版本,则需要采用没有全局变量的形式,采用TLS形式:

4.1          定义一个全局的数据结构;

typedef struct

{

       CSuspectImgArray *pSuspectImgArray ;

       SLINEINFO *pGlobalCurLine;

       SWORDINFO *pGlobalCurWord;

       TInt32 nSplitNum;

       BOOL   bInitFlag ;

       SEEDDICT   SeedDict[MAXLANG];

       TInt32     g_nLangNum; //recognition Language count

       SELFDICT   SelfDict;

} TGlobalData;

4.2          初始化函数中加上;

       TGlobalData* pD;

       pD = (TGlobalData*)new TGlobalData;//申请内存分配

       if( !pD )return STATUS_NO_ENOUGH_RAM;

       //设置thread local storage

       if(Dll::SetTls(pD) != KErrNone)

       {//主线程

              delete pD;

              return STATUS_FAILED;

       }

4.3          使用函数中

#ifdef SYMBIAN

     TGlobalData*  pD = (TGlobalData*)Dll::Tls();

     if ( !pD )

            return 0;

#endif

g_GlobalImg = pWordImg;

 

其中定义(也可以不这样定义,直接访问,之所以这样定义,是为了跟没有使用TLSC程序好兼容,无需修改):

              #define       g_GlobalImg     pD->g_GlobalImg

4.4          最后释放函数

       delete (TGlobalData*)Dll::Tls();

       Dll::SetTls(NULL);

原创粉丝点击