【问题标题】:Android. NDK. How to log calling destructor of global variable?安卓。 NDK。如何记录调用全局变量的析构函数?
【发布时间】:2015-04-22 21:01:14
【问题描述】:

众所周知,android 在关闭应用程序后不会卸载 *.so。我通过在末尾添加“exit(0)”找到了解决方案,即解决了问题,但我想确切地知道一切都很好。

解决问题后代码正常运行:

static int value = 0;

// In android_main
LOGI("value = %d", value); // always print 0, but not 1 after second run of
// application as it was without "exit(0)" at the end
value = 1;

我想在课堂上测试一下:

class A {
  A() {
    LOGI("Constructor");
  }
  ~A() {
    LOGI("Destructor");
  }

statis A a;

以这种方式只打印“构造函数”。 也许是因为当 LOGI 不再为将要关闭的应用程序工作时调用了析构函数? 问题:为什么析构函数中的 LOGI 不起作用?根据顶部析构函数的第一个示例,它确实在调用。

【问题讨论】:

  • 关闭应用程序后它不会卸载 .so 是什么意思。你是说活动结束后?它不应该——如果你需要的话,可以调用 JNI 来释放任何变量并在 onDestroy 或finish 中调用它。如果你的意思是它在实际结束进程后没有卸载和重新加载 - 你错了。
  • 是的,我的意思是在完成活动之后。我想释放的不是变量,而是单例,因此我需要 android 调用静态变量 aftef 完成活动的析构函数。
  • 然后不要杀死或退出进程 - 批量取消分配内核中的所有内容。如果您真的想处理您的单例,请删除所有引用,然后根据其性质对其进行垃圾收集或调用其析构函数。

标签: android c++ static android-ndk


【解决方案1】:

这不仅没有意义,而且很可能适得其反。如果android想要你的进程使用的内存,它将终止进程以回收它;如果没有,它不会。

为了具体解决您的问题,杀死或退出进程不会调用析构函数,它只会终止执行,内核会批量释放所有内存和(常规)资源。

不要尝试对系统进行第二次猜测,因为这经常会导致杀死一个进程,然后让 android 立即重新启动它。此外,据称它可能会导致一些 Android IPC 资源(如相机)出现问题,当正在使用的应用程序的进程意外终止时,这些资源可能无法释放。

【讨论】:

  • 那我怎样才能创建一个单例呢?
  • 以通常的方式 - 仅当全局静态对象不存在时才创建它。这与此无关,如果真的不熟悉属于它自己的问题 - 尽管这里可能已经有重复项。
猜你喜欢
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 2011-01-13
  • 2013-10-09
  • 2015-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多