トップページ > プログラム > 2014年10月18日 > +2U70lQ2

書き込み順位&時間帯一覧

9 位/206 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000001000101020000005



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
62
★★Java質問・相談スレッド171★★

書き込みレス一覧

★★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で色々やろうと思っているので、この本は仕入れてもいいかな。
ありがとうございました。


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。