2011-06-29 2 views
2

Androidソース/外部/ statictestフォルダの中に入れたテスト用のC++コードを添付してください。このフォルダ内のファイルはstatictest.cpp、statictest.h、Android.mkです。アンドロイドでC++実行可能ファイルを実行しているときに静的初期化に問題がありますか?


statictest.cpp

#include <stdio.h> 
#include "statictest.h" 



NPT_Mutex Application::lock; 

int main() 
{ 
// NPT_Mutex *obj = new NPT_Mutex(); 
// Application *obj = new Application(); 
    printf("Lock address is 0x%x\n",(unsigned int)&(Application::lock)); 
    return 0; 
} 

statictest.h

class NPT_Mutex 
{ 
    public: 
     NPT_Mutex(){result = 10;} 
     ~NPT_Mutex(){} 

    private: 
     int result; 

}; 

class Application 
{ 
    public: 
     Application(){} 
     ~Application(){} 

     static NPT_Mutex lock; 

}; 

Android.mk

ifneq ($(TARGET_SIMULATOR),true) 

LOCAL_PATH:= $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_SRC_FILES:= statictest.cpp 
LOCAL_C_INCLUDES:= statictest.h 
LOCAL_MODULE := statictest 
LOCAL_STATIC_LIBRARIES := libcutils libc libstdc++ 
include $(BUILD_EXECUTABLE) 

endif # TARGET_SIMULATOR != true 

私は、ソースコードをコンパイルし、MIPSツールチェーンとAndroidのビルド設定を使用して実行可能ファイルを作成しました。しかし、私が見ているのは、静的初期化がここでは起こっていないということです。しかし、同じコードがx-86環境でx-86ツールチェーンを使って実行されているときは、明らかに初期化されています。

この問題を理解して解決するために私の貴重な点をお寄せください。

おかげで、
セン

+0

printfは何を示していますか?結果の価値を印刷できますか?おそらくいくつかのprintfをコンストラクタとデストラクタに追加しますか?好奇心のため、クラスのミューテックスメンバーがなぜ静的である必要があるのでしょうか? – AJG85

+0

実際にはこれはテストの実装ですが、実際にはAndroidにプロジェクトを移植しようとしていましたが、このような静的メンバーが数多くあります。 – Sen

+0

リンカーによって.initセクションに置かれたものをダンプしましたか?objdumpを使ってチェックする __do_global_ctors_auxでgdb/gdbserverを壊して、グローバルコンストラクタを実行するステップがあるかどうかを確認してください。 これは、これがいくつかのMIPSバイオリンC lib/toolchainの組み合わせに関する問題であると思われます。あなたのツールチェーンはどこから来たのですか?MIPSはAndroidフォークをhttp://developer.mips.com/android/でサポートしていますか? – kert

答えて

0

(建設についてのあいまいさは「main()」の前には存在しないので)それが働いている必要がありますようにそれは思えるようにするには、「main.cpp」であなたの静的インスタンスを置きます。 (割り当てられていたが、B::B()コンストラクタが呼び出される前にABBを参照することができ)

はしかし、私は、DLLの境界を越えて、静的インスタンスの同様の問題を持っていた、またはシングルトンが他のシングルトンを参照するとき。このような場合には、合理的な回避策は、(もあなたのために働くべきであること)を明示的にインスタンス化を強制的に:いくつかのケースでは

//SomeClass my_singleton; // OLD, NOW INSTANTIATE EXPLICITLY 

SomeClass& GetSomeClassSingleton(void) { 
    static SomeClass my_singleton; // Instantiate once, explicitly 
    return my_singleton; 
} 

、あなたは「やや動的」インスタンス化することもできます。

SomeClass& GetSomeClassSingleton(void) { 
    static SomeClass* my_singleton = NULL; 
    if(!my_singleton) { 
    my_singleton = new SomeClass(); 
    } 
    return *my_singleton; 
} 

もちろん、シングルトンのコンストラクタにパラメータを渡す必要がある場合でも、アプローチはうまく動作します。

幸運にも、Androidで作業している場合は教えてください(私は本当にそこで動作するかを知りたがっています)。私は、AndroidのプロセスローディングがDLL間のシングルトンに同様の問題を抱えていると推測します。そのような場合には、上記のパターンをシングルトンに使用します。

関連する問題