Android GLThread和HeapWorker之间的并发问题

Android GLThread和HeapWorker之间的并发问题,android,opengl-es,garbage-collection,android-ndk,swig,Android,Opengl Es,Garbage Collection,Android Ndk,Swig,我的问题涉及在Android操作系统中使用通过Swig向Java公开的本机NDK库 本机库是一个OpenGLES引擎。在应用程序的生命周期中,java代码可能会创建本机类的实例,我们将使用这些实例为引擎提供数据。让我烦恼的是,这些类可能会在Java端被垃圾收集。在这种情况下,将通过swig生成的finalize方法删除对象的是主机线程(GLThread)以外的另一个线程(HeapWorker)。这会导致本机引擎中出现一些并发问题,HeapWorker线程可以在删除对象的过程中使用这些对象 是否可

我的问题涉及在Android操作系统中使用通过Swig向Java公开的本机NDK库

本机库是一个OpenGLES引擎。在应用程序的生命周期中,java代码可能会创建本机类的实例,我们将使用这些实例为引擎提供数据。让我烦恼的是,这些类可能会在Java端被垃圾收集。在这种情况下,将通过swig生成的finalize方法删除对象的是主机线程(GLThread)以外的另一个线程(HeapWorker)。这会导致本机引擎中出现一些并发问题,HeapWorker线程可以在删除对象的过程中使用这些对象

是否可以:

1-以某种方式自定义垃圾收集器,使其与GLThread同步

2-运行终结器线程

3-在垃圾收集期间锁定GLThread


感谢您的帮助。

当GLThread执行一些访问Java对象jo的JNI时,JNI将保留对jo的本地引用,因此垃圾收集器将不会触及该对象。但是,如果您的本机代码在JNI调用中保留指向某些Java对象(object)的指针,垃圾收集将成为问题。不幸的是,不仅GC会被破坏;你的代码不会在ICS或JB上运行。我的代码在ICS上运行得很好,垃圾收集工作正常。剩下的唯一问题是并发问题,所以我们可以让C++对象在他们被删除时(在GCID中)从他们注册的任何东西(作为指针)注销。但这必须在适当的线程中完成。