2011-01-14 13 views
4

C++オブジェクトをラップしてJavaからアクセスできるようにしたいと思います。 jni and using c++ new'ed objects in javaを読んで、JavaラッパークラスのC++オブジェクトへの参照を保存する方法を理解しました。しかし、私が把握していないことの1つは、C++オブジェクトの作成と削除を処理する方法です。確かに、私は自分のC++オブジェクトを作成して削除するネイティブメソッドを導入することができますが、これはJavaでメモリ管理を自分自身で処理しなければならないことを意味します。 Javaラッパーオブジェクトが作成され、ガベージコレクトされたときに呼び出されるネイティブメソッドは実装する必要がありますか?JNI:ラップされたC++オブジェクトの作成/削除を処理する方法

答えて

7

C++オブジェクトを作成および破棄するネイティブメソッドを記述する必要があります。私はあなたがどのようにそれらをJavaで呼び出すことができるか知っている3つの異なる方法があります。

  • Javaオブジェクトに対してpublic void finalize()メソッドを実装します。ガベージコレクタは、オブジェクトがファイナライズされた後にこのメソッドを呼び出します。ここでdestroyメソッドを呼び出すと、ガベージコレクタがすべてを処理します。 finalize()には欠点があります。ガベージコレクタが遅くなり、いくつかの名前から別のスレッドに呼び出されます。

  • dispose()メソッドを記述し、手でメモリを管理します。これはネイティブリソースに対してswing/AWTによって使用されます。これにより、いつどこでC++オブジェクトが削除されるかを制御できます。 finalize()を実装してメモリリークを止めたり、コードをデバッグすることは可能です。

  • PhantomReferenceクラスとReferenceQueueを使用して、オブジェクトの1つがガベージコレクトされているかどうかを確認し、そこからC++オブジェクトを削除します。これにより、finalize()の代替手段が提供されます。