2011-06-29 37 views
2

請在附件中找到我的測試C++代碼,這些代碼放在Android Source/external/statictest文件夾中。該文件夾內的文件是statictest.cpp,statictest.h和Android.mk。在android中運行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.cpp」,這樣看來似乎應該有工作(因爲沒有關於建設歧義之前「main()」)。

不過,我有靜態情況下的類似問題跨邊界的DLL,或者當單身引用其他單身人士(A可以B被分配後參考B,但B::B()構造函數被調用之前)。在這種情況下,合理的變通(即應該也爲你工作)明確強制實例:

//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邊界,並且在這種情況下我使用上述的單身人士模式。