我有C++和C#的经验,还略懂一点Java,现在开始进行一个Java+JNI(C++)项目(如果是Android平台则更好)。
我有一个本地方法,它创建了一些C++类,并将其作为Java long值(称为句柄)返回指针。然后其他从Java代码调用的本地方法使用该句柄作为参数,在这些类上执行一些本地操作。C++端不拥有该对象,而是由Java端拥有。但在当前的架构设计中,很难定义谁确切地拥有对象以及何时删除它。因此,让Java虚拟机垃圾回收程序以某种方式来管理对象的生命周期可能会很不错。C++类没有消耗任何资源,除了一小段内存,因此如果不销毁几个这样的对象也是可以的。
在C#中,我可能会在某个托管的包装类中包装本机IntPtr句柄。并覆盖其终结器以在托管包装类被垃圾收集时调用本机对象的析构函数。SafeHandle、AddMemoryPressure等等也可能会对此有所帮助。
在Java中,情况就不同了。在Java的“Hello world”之后,你知道的第二件事就是finalize的使用是不好的。在Java中还有其他的方法来完成这个任务吗?或者可以使用PhantomReference?