Android JNI:如何实现用Java对象创建和删除的C ++对象?

时间:2012-12-26 14:08:18

标签: android object java-native-interface creation

我有一个使用JNI创建C ++渲染器的WallpaperService.Engine实现:

引擎(Java) - >渲染器(C ++)

如果渲染器是Java代码,我可以简单地说明

private Renderer renderer = new Renderer();

确保渲染器是使用我的引擎创建的,并在不再需要时自动销毁。那么最干净的方法是什么?

P.S。:我在想:

int rendererId = createNativeRenderer();
...
draw(rendererId); // call all native renderer methods specifying the object id
...
deleteNativeRenderer(rendererId); 

但它不是很优雅,因为它需要明确删除,这很容易忘记。

1 个答案:

答案 0 :(得分:0)

是的,它不是很优雅,但它是迄今为止最可靠的方式。 Java试图成为每个钉子的锤子,因此有一个叫做终结器的东西 - 一个被称为垃圾收集你的实例的Object方法。所以理想情况下完全符合您的需要,但几乎可以更好地避免。如果您仔细阅读the related Javadoc,您会发现:

  • 如果您或您的代码认为合适,但是当引用计数引擎决定时,您的珍贵渲染器将被调用。更糟糕的是,不是在那个特定的时刻,而是在以后的任何时候。
  • 您无法知道并且无法影响,哪个线程会调用终结器。如果代码与UI操作有关(我明白你的代码是),那么双脚会在脚中射击。

但是,您可以使用终结器进行安全检查。

  1. 使用公共方法删除
  2. ,在对象中包装渲染器生命周期(创建/使用/删除)
  3. 在明确删除时,设置内部标志
  4. 覆盖finalize()并检查那里的标志状态。如果未标记为已删除,请记录令人讨厌的错误