0

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

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

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

private Renderer renderer = new Renderer();

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

PS:我在想:

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

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

4

1 回答 1

0

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

  • 您宝贵的渲染器删除代码不会在您或您的代码认为合适时调用,而是在引用计数引擎决定时调用。更糟糕的是,不是在那个特定的时间点,而是在以后的任何时候。
  • 你无法知道也无法影响哪个线程将调用终结器。如果代码与 UI 操作相关(我知道您的代码是),那么双管齐下。

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

  1. 将渲染器生命周期(创建/使用/删除)包装在具有公共删除方法的对象中
  2. 在显式删除时,设置一个内部标志
  3. 覆盖finalize()并检查那里的标志状态。如果未标记为已删除,则记录讨厌的错误
于 2012-12-26T18:04:16.950 回答