JNI メソッドを使用して Java オブジェクトを構築している場合、JNI 呼び出し API を使用して呼び出している Java メソッドにパラメータとして渡すために、そのメモリをどのように管理すればよいですか?
これが私が取り組んでいるものです:
より複雑なデストラクタ メソッドを持つ C オブジェクトがありますfree()
。この C オブジェクトは Java オブジェクトに関連付けられます。アプリケーションが Java オブジェクトで終了すると、C オブジェクトはもう必要ありません。
私は次のようにJavaオブジェクトを作成しています(明確にするためにエラーチェックを省略しています):
c_object = c_object_create ();
class = (*env)->FindClass (env, "my.class.name");
constructor = (*env)->GetMethodID (env, class, "<init>", "(J)V");
instance = (*env)->NewObject (env, class, constructor, (jlong) c_object);
method = (*env)->GetMethodID (env, other_class, "doSomeWork", "(Lmy.class.name)V");
(*env)->CallVoidMethod (env, other_class, method, instance);
では、これで作業が完了したinstance
ので、何をすればよいでしょうか? 理想的には、ガベージ コレクションを VM に任せたいと思います。それが完了したら、私が提供したポインターinstance
も呼び出すと素晴らしいでしょう。c_object_destroy()
これは可能ですか?
別の関連する質問は、このようなメソッドで作成する Java エンティティのスコープに関係しています。class
、、、constructor
またはそれ以上を手動でリリースする必要がmethod
ありますか? JNI のドキュメントは、適切なメモリ管理に関して、イライラするほど曖昧です (私の判断では)。