【回転】Symbian OSプラットフォーム上でC言語エンジニアリングを移植する方法


【回転】Symbian OSプラットフォーム上でC言語エンジニアリングを移植する方法
原文住所:
http://blog.csdn.net/dznlong/archive/2006/02/13/597942.aspx
 
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、すなわち2つの「const」があることに注意してください.グローバル静的変数または静的定数がある場合は、MMPファイルにEPOCALLOWDLDATA IDを追加します.そうしないとコンパイルエラーが発生します.書き込み可能なグローバル静的変数には、すべてのグローバル変数を1つのSTRUCT構造に配置し、この構造のポインタをDll::SetTls()とDll::Tls()でアクセスする処理方法があり、CでコンパイルされたコードではC++を呼び出すことができないという問題があり、最も愚かな処理方法はポインタの値を1つのファイルに格納することである.
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);