我正在尝试追踪Android应用程序中的问题。此问题导致代码的本机层中的垃圾收集期间崩溃。我会自己解释一下。
我的应用程序仅包含控制GUI元素的java源代码,以及管理应用程序的呈现和其他性能关键部分的本机库。它具有用于渲染的GLSurfaceView。
java层需要能够访问和实例化本机对象,因此这些通过Swig向Java公开。 Swig所做的是在每个包装器类中(在Java中)它生成一个finalize方法,该方法将调用本机删除操作符。
考虑以下伪代码:
在C ++中:
class MyClass {
public:
MyClass () {}
~MyClass ()
{
print("deleting MyClass instance");
print("doing 1");
do1();
print("doing 2");
do2();
print("doing 3");
do3();
print("instance deleted");
}
};
这是伪代码意味着例如“print”代表android logcat中的print我只是保持简单愚蠢;)。
让我感到困惑的是,当垃圾收集器运行并在某些情况下调用析构函数时,我可以发现输出在多个析构函数之间交错(就好像它们被同时删除一样)。在这个例子中,它可能是:
deleting MyClass instance
doing 1
deleting MyClass instance
doing2
doing1
doing2
deleting MyClass instance
doing3
doing3
instance deleted
doing1
doing2
instance deleted
doing3
instance deleted
同时logcat明确指出这些消息来自同一个线程(终结器线程)。
因此我的问题是:“单个线程如何同时执行多个本机调用?”
答案 0 :(得分:0)
本机析构函数是否回调到VM?