2013-10-24 23 views
2

我想在我的Android应用程序中找出问题。此问题在代码的本机层的垃圾回收过程中导致崩溃。我会解释一下自己。单个java线程如何一次执行多个本地方法?

我的应用程序仅包含java源代码控制GUI元素等,以及管理应用程序渲染和其他性能关键部分的本机库。它具有用于渲染的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"); 
     } 
}; 

这是伪代码,这意味着如“打印”表示打印在Android的logcat的,我只是保持它简直是愚蠢的; )。

让我感到困惑的是,当垃圾收集器运行并在某些情况下调用析构函数时,我可以在多个析构函数之间找到交织输出(就好像它们被同时删除一样)。在这个例子情况下,它可能是:

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中明确指出,这些消息在同一个线程(终结器线程)发起。

因此,我的问题:“一个线程如何能同时执行多个本地调用?”

+1

见http://stackoverflow.com/questions/11052064/jvm-garbage-collection – Samhain

+0

@Samhain,这里并不适用,因为这发生在Dalvik虚拟机,而不是JVM –

+0

感谢@TassosBassoukos,我想的太多了这个问题并没有解释这个问题。 –

回答

0

本地析构函数是否回调到虚拟机?

+0

nope,只有下面的本地堆栈帧... –

相关问题