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 はすべての爪のハンマーになろうとするため、ファイナライザーと呼ばれるものがあります。これは、インスタンスのガベージ コレクション時に呼び出されるオブジェクト メソッドです。したがって、理想的には必要なことを正確に実行しますが、実際には避ける方がよいでしょう。関連する Javadocを注意深く読むと、次のことがわかります。

  • 貴重なレンダラー削除コードは、あなたまたはあなたのコードが適切だと判断したときではなく、参照カウント エンジンが決定したときに呼び出されます。さらに悪いことに、その特定の時点ではなく、後でいつでも.
  • どのスレッドがファイナライザーを呼び出すかを知ることも、影響を与えることもできません。コードがUI操作に関連している場合、ダブルバレルショットが足元に表示されます(あなたのコードがそうであることは理解しています)。

ただし、ファイナライザーを安全チェックに使用できます。

  1. レンダラーのライフサイクル (作成/使用/削除) を削除用の public メソッドでオブジェクトにラップする
  2. 明示的な削除時に、内部フラグを設定します
  3. finalize()そこでフラグの状態をオーバーライドして確認します。削除済みとしてマークされていない場合は、厄介なエラーをログに記録します
于 2012-12-26T18:04:16.950 に答える