請在附件中找到我的測試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工具鏈運行時,它的代碼顯然已經初始化了。
請擺脫你的寶貴指針,讓我瞭解這個問題並解決它。
感謝,
森
printf顯示什麼?你能打印結果的價值嗎?也許添加一些printf給構造函數和析構函數?出於好奇,爲什麼一個類的互斥量成員需要靜態? – AJG85
其實這是一個測試實現,我實際上是試圖將一個項目移植到Android,並且它有一些像這樣的靜態成員.. – Sen
您是否已經拋出了鏈接器放入.init節的內容?使用objdump來檢查 看看你是否可以在__do_global_ctors_aux中使用gdb/gdbserver來查看是否通過執行全局構造函數來執行。 我懷疑這會是一些MIPS仿生C/lib/toolchain組合相關的問題。你的工具鏈來自哪裏,MIPS支持Android的分支http://developer.mips.com/android/? – kert