次の問題があります。PNG画像を基本的に生データとして取得し、メモリに保持するCコードがあります。JNI を使用して、この生データを Java の BufferedImage に変換したいと考えています。誰かがこれを行う方法を知っているか、以前にこれを行ったことがありますか?
3 に答える
JNI を使用して関数を呼び出す方法の基本を理解していることを前提としています。お尻の痛みになる可能性がありますが、それほど複雑ではありません。
すぐに実行したい場合は、PNG を一時ファイルに書き込み、JNI を介してファイル名を渡し、ImageIO を使用してロードします。
より洗練されたファイル パスを必要としない場合は、JNI を介して渡すバイト配列をラップするByteArrayInputStream で ImageIO.read(InputStream) を使用できます。C からNewByteArray()を呼び出し、 SetByteArrayRegionを使用してデータを設定できます。
最後に、HTTP を使用してデータを転送することを検討することもできます。Apacheには、C コードから Java に POST できる小さな Web サーバーを含む、使用できる一連のコンポーネントがあります。
これまでにJNIを使用したことがない場合は、 JNIプログラマーズガイドと仕様を参照することをお勧めします。
要約すると、あなたがしなければならないことは次のとおりです。
native
実装なしで、キーワードを使用してJavaメソッドを作成します。- ネイティブメソッドを使用してクラスでコマンド
javah
を使用し、ヘッダーファイル(.h)を生成します。javah
JDKインストールが付属しています。 - ネイティブJava関数をC/C++で実装します。
- クラスjava.awt.image.BufferedImageを検索します。
- 使用するコンストラクターを検索します。
- 指定されたコンストラクターを使用してBufferedImageオブジェクトを作成します。
- setPixelメソッドを検索します。
- そのメソッドを実行して、画像の各ピクセル値を設定します。高さx幅の時間を実行する必要があります。
- オブジェクトを返します。
- ネイティブファイルを共有ライブラリにコンパイルします。
- 共有ライブラリをJavaクラス内にロードします。
- 共有ライブラリをリンクして、Javaクラスを実行します。
画像の生データをコピーする方法は他にもありますが、この方法で十分です。
Java ライブラリは PNG をサポートしているため、C から Java にすべてのバイトをコピーするメカニズムを追加し、Chad Okereが示唆するように ImageIO クラスを使用します。
また、作業を楽にするために JNA を使用することを検討してください (JNA を使用して Windows カーソルを描画する例)。