JNIを介してCとJava間でポインタを渡す 質問する

JNIを介してCとJava間でポインタを渡す 質問する

現在、CUDA 機能を使用する Java アプリケーションを作成しようとしています。CUDA と Java 間の接続は正常に動作しますが、別の問題が発生しており、それについての私の考えが正しいかどうかをお尋ねしたいと思いました。

Java からネイティブ関数を呼び出すときに、何らかのデータを渡すと、関数が何かを計算して結果を返します。最初の関数でこの結果への参照 (ポインター) を返し、それを JNI に渡して、その結果を使ってさらに計算を行う別の関数を呼び出すことは可能ですか?

私のアイデアは、データを GPU メモリに残し、他の関数が使用できるように参照を渡すだけで、GPU との間でデータをコピーする際に発生するオーバーヘッドを削減するというものでした。

しばらく試してみた後、ポインターはアプリケーションが終了した後 (この場合は、C 関数が終了した後) に削除されるため、これは不可能であるはずだと自分自身で考えました。これは正しいでしょうか? それとも、解決策がわからないほど C が下手なのでしょうか?

編集: 質問をもう少し広げて (またはより明確に) 言うと、JNI ネイティブ関数によって割り当てられたメモリは、関数が終了すると解放されますか? それとも、JNI アプリケーションが終了するか、手動で解放するまで、そのメモリにアクセスできますか?

ご意見ありがとうございます:)

ベストアンサー1

私は次のアプローチを使用しました:

JNI コードで、必要なオブジェクトへの参照を保持する構造体を作成します。この構造体を最初に作成するときに、そのポインターを として Java に返しますlong。次に、Java からこれをパラメーターとして任意のメソッドを呼び出しlong、C でそれを構造体へのポインターにキャストします。

構造体はヒープ内にあるため、異なる JNI 呼び出し間でクリアされることはありません。

編集: アドレスは静的変数なので、long ptr = は使用できないと思います(long)&address;。Gunslinger47 が提案した方法、つまりクラスまたは構造体の新しいインスタンスを作成し (new または malloc を使用)、そのポインターを渡します。

おすすめ記事