JNIによるCとJavaの間のポインタの受け渡し
質問
現在、私は CUDA 機能を使用する Java アプリケーションを作成しようとしています。CUDA と Java の間の接続はうまくいきますが、別の問題があり、それについて私の考えが正しいかどうか、尋ねたいと思いました。
Java からネイティブ関数を呼び出すとき、いくつかのデータを渡し、関数は何かを計算し、結果を返します。最初の関数がこの結果への参照 (ポインター) を返すようにして、それを JNI に渡して、その結果でさらに計算する別の関数を呼び出すことは可能でしょうか。
私のアイデアは、データをGPUメモリに残し、他の関数がそれを使用できるようにそれへの参照を渡すことによって、GPUとの間でデータをコピーすることから生じるオーバーヘッドを減らすことでした。
しばらく試した後、私は自分自身で考えました。ポインターはアプリケーションが終了した後(この場合、C関数が終了したとき)削除されるため、これは可能ではないはずです。これは正しいのでしょうか?それとも、解決策を見るには、私が C 言語に不得手なだけでしょうか?
編集します。 さて、質問を少し拡大するために(またはより明確にするために)。JNI ネイティブ関数によって割り当てられたメモリは、関数が終了したときに解放されるのでしょうか? それとも、JNI アプリケーションが終了するか、または手動で解放するまで、まだアクセスできるのでしょうか?
あなたの意見に感謝します :)
どのように解決するのですか?
次のような方法をとりました。
JNIコードで、必要なオブジェクトへの参照を保持する構造体を作成します。この構造体を最初に作成するとき、そのポインタをJavaに
long
. そして、javaから任意のメソッドを呼び出すには、この
long
をパラメータとして任意のメソッドを呼び出し、C言語ではこれを構造体へのポインタにキャストします。
構造体はヒープにあるので、異なるJNI呼び出しの間でクリアされることはないでしょう。
EDIT: long ptr = を使うことはできないと思います。
(long)&address;
アドレスはスタティック変数なので Gunslinger47が提案した方法、つまりクラスや構造体の新しいインスタンスを(newやmallocを使って)作り、そのポインタを渡すという方法で使ってください。
関連
-
SocketException java.netの4つの例外解決策。
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] Javaで配列を宣言し、初期化する方法は?
-
[解決済み] Java内部クラスと静的ネストされたクラス
-
[解決済み] StringBuilderとStringBufferの違いについて
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] wait()とsleep()の違いについて
-
[解決済み] Javaクラスにおけるcanonical name、simple name、class nameの違いは何ですか?
-
[解決済み] 静的変数が悪とされるのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Eclipseは、ポップアップA Java Exception has occurred.を実行し、エラーException in threadの解決策を報告します。
-
実行中にEclipseがポップアップする A Java Exception has occurred
-
undefined[sonar] sonar:デフォルトのスキャンルール
-
Java の switch case 文で必要な定数式の問題の解決法
-
SpringBoot 起動エラー java.nio.charset.MalformedInputException: 入力長 = 2 解決
-
keytool error: java.io.FileNotFoundException: cacerts (アクセス拒否されました。)
-
Java Runtime Environmentを継続するためのメモリが不足しています。
-
春ブート複数のデータソースの管理(atomikos)同じサーバーホスト上の複数のプロジェクトを開始する複数のJava - jarのエラーソリューション
-
swagger2 モデルが表示されない モデルが見つからない @ApiModel アノテーションが表示されない問題
-
CAS 5.1.8でhttpをサポートし、認証されていない認可サービスエラーのプロンプトが表示される問題を解決した。