Проблема в статической инициализации при запуске исполняемого файла C ++ в Android? - PullRequest
2 голосов
/ 29 июня 2011

Пожалуйста, приложите мой тестовый код C ++, который я поместил в папку Android Source / external / statictest.Файлы внутри этой папки: statictest.cpp, statictest.h и Android.mk.


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

Я скомпилировал исходный код и создал исполняемый файлс помощью Android Build Setup с набором инструментов MIPS.Но я вижу, что статическая инициализация здесь не происходит.Но тот же код, когда он запускается в среде x-86 с использованием цепочки инструментов x-86, он явно инициализируется.

Пожалуйста, добавьте ваши ценные указатели, чтобы я понял эту проблему и решил ее.

Спасибо,
Сен

1 Ответ

0 голосов
/ 29 июня 2011

Вы помещаете свой статический экземпляр в "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, и в таких случаях я использую приведенные выше шаблоны для синглетонов.

...