在Symbian OS平臺上移植C語言工程的方法

Symbian是應用於高端手機(智能手機)上的一種操作系統,諾基亞、索愛的高端手機便是基於Symbian操作系統的,Symbian OS的優勢在於其高穩定性和節能性,並且有衆多主流手機產商的支持,現在是高端手機上的主流操作系統之一。在Synbian OS上的應用開發主要是以C++語言爲主,但是也支持C語言的程序,把原有的C語言工程移植到Symbian OS上也是很容易的,其方法有如下幾點:

1、首先要考慮C語言和C++語言的混合編程問題,因爲在UI層肯定是要以C++語言來設計的,UI層中的代碼無法被移植,必須結合平臺上的UI設計方法來設計,而UI層中要實現的功能可以用C語言來實現,所以要考慮好哪些應該用C++來設計,哪些應該用C語言來設計,如果出現C語言中的代碼調用C++中的代碼(這種情況應該儘量避免),則該C語言的代碼必須用C++來編譯,用C++來編譯的文件名最好以“CPP”爲擴展名,在C++中引用C的代碼是最好加上“extern “C” {}”,在用C編譯的頭文件中要有這樣的修飾:

#ifdef __cplusplus

extern "C" {

#endif

...

#ifdef __cplusplus}

#endif

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);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章