gpt4 book ai didi

c++ - 在 android 中运行 C++ 可执行文件时静态初始化问题?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:01:13 25 4
gpt4 key购买 nike

请在附件中找到我放在 Android Source/external/statictest 文件夹中的测试 C++ 代码。此文件夹中的文件是 statictest.cpp、statictest.h 和 Android.mk。


静态测试.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;
}

静态测试.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 Build Setup 创建了可执行文件。但我看到的是这里没有发生静态初始化。但是当使用 x-86 工具链在 x-86 环境中运行相同的代码时,它显然正在初始化。

请为我理解和解决这个问题提供宝贵的指导。

谢谢,

最佳答案

您将静态实例放在“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 边界的单例类似的问题,在这种情况下,我对单例使用上述模式。

关于c++ - 在 android 中运行 C++ 可执行文件时静态初始化问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6515987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com