- ★★Java質問・相談スレッド171★★
62 :デフォルトの名無しさん[sage]:2014/10/18(土) 09:47:41.48 ID:+2U70lQ2 - JNIでCからJavaへコールバックする時、Javaの戻り値がObjectの場合の参照はどうなるんでしょう?
#CallObjectMethodの戻り値の扱いです。 JavaからCへの呼び出しの時のパラメータはローカル参照になってCの関数からリターンしてJavaに戻ると自動でGC対象になるみたいだけど、コールバックの戻り値の場合はそもそも制御がJavaには戻らないし… 自分でDeleteGlobalRefやDeleteLocalRefを呼ばなきゃいけないのかそもそもCでローカル変数のポインタを返すみたいにやっちゃいけないことなのかわからない。 ググってみたけどそこらへんのこと書いてあるページは見つけられませんでした。 どなたかご存じの方がおりましたらお教え下さい。
|
- ★★Java質問・相談スレッド171★★
66 :62[sage]:2014/10/18(土) 13:57:02.71 ID:+2U70lQ2 - >>65
このページは既に読んでいましたが、 「CからJavaへコールバックする時、Javaの戻り値がObjectの場合の参照」に関しては書いて無かったです。 確かに >>JNI内部でJavaのオブジェクトを使う場合、オブジェクトのリファレンスは(基本的に)ローカル参照というスコープになっている。 >>ローカル参照は JNI呼び出しが終了すると自動的に解放されるため、ローカル参照のオブジェクトは静的(JNI呼び出し間の受け渡しや別スレッドへの受け渡し用)に保持することが出来ない。 と書いてあるのですが、これはJavaからCを呼び出す場合で、コールバックの戻り値の場合はこの後Javaに制御を戻さないので「JNI呼び出しの終了」の状態にならないのでは?と思います。 あと、コールバックのサンプルも載っているんですが、CallVoidMethodで戻り値が無い例でした。 とりあえずはDeleteLocalRefしといてリークしているようならDeleteGlobalRefすればいいか… 参照がない状態になっているなら長時間動かしたらメモリエラーが出るだろうし。 #DeleteLocalRefやDeleteGlobalRefは戻り値voidだからエラーでも判らないしなぁ。
|
- ★★Java質問・相談スレッド171★★
68 :62[sage]:2014/10/18(土) 15:50:19.07 ID:+2U70lQ2 - >>67
> 二行目本に書いてあると思うけど、詳しいことは忘れたので頑張ってくれ 本と言うと「JNI:Java Native Interfaceプログラミング―C/C++コードを用いたJavaアプリケーション開発(ISBN:4894710803)」でしょうか? JNI本で調べるとこれが唯一の本みたいです。 でもこれって絶版みたいでAmazonでも中古だけしかない。あと、結構古いので使える所と使えない所の選別が面倒そう。 まずは仕入れて見てみよう。
|
- ★★Java質問・相談スレッド171★★
75 :62[sage]:2014/10/18(土) 17:57:13.61 ID:+2U70lQ2 - >>71
おお〜本当だ。こんな所で呼んでいるのに気がつきませんでした。 じゃあCallObjectMethodの戻り値はローカル参照で使い終わったらDeleteLocalRefすれば良いということで。 ありがとうございました。
|
- ★★Java質問・相談スレッド171★★
77 :62[sage]:2014/10/18(土) 17:59:53.57 ID:+2U70lQ2 - >>74
なるほど。最初の書き込みの件は解決したけどJNIで色々やろうと思っているので、この本は仕入れてもいいかな。 ありがとうございました。
|