Android。 NDK。如何记录调用全局变量的析构函数?

Android. NDK. How to log calling destructor of global variable?

我们都知道 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 上测试它,例如:

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

statis A a;

这样只打印"Constructor"。 也许是因为当 LOGI 不再为将要关闭的应用程序工作时调用析构函数? 问题:为什么析构函数中的 LOGI 不起作用?根据第一个例子,顶级析构函数确实在调用。

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

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

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