2009-05-09 10 views
2

次の問題があります。私は基本的に生データとしてPNG画像を取得し、メモリに保持するCコードを持っています。この生データをJNIを使​​用してJavaのBufferedImageに変換することをお勧めします。誰でもこれを行う方法を知っているのですか、これを前に行っていますか?JNI Cコードを使用してJavaにBufferedImageとしてPNGイメージをロード

答えて

4

JNIで関数を呼び出す方法の基本を知っているとします。それは複雑なことではありませんが、それはお尻の痛みになる可能性があります。

すぐに処理したい場合は、一時ファイルにPNGを書き込み、ファイル名をJNIに渡してImageIOを使用して読み込みます。

さらに洗練されたファイルパスが必要ないようにするには、ImageIO.read(InputStream)ByteArrayInputStreamで使用して、JNI経由で渡すバイト配列をラップします。 CからNewByteArray()を呼び出し、SetByteArrayRegionを使用してデータを設定することができます。

最後に、小さなWebサーバーを含むApache has a set of components you can useのHTTPを使用して、CコードからJavaにPOSTすることができます。

+0

私は実際にそれをやった後、私はそれを行う方法を読んでいえねえチャドは、コメントを おかげで、これは、私がやってしまった、まさに実際に:) – ldog

1

以前にJNIを使​​用したことがない場合は、JNI Programmer's Guide and Specificationをご覧ください。要約で

、何をしなければならないことは次のとおりです。

  1. なしの実装で、nativeキーワードでJavaメソッドを作成します。
  2. ネイティブメソッドのクラスでjavahコマンドを使用して、ヘッダーファイル(.h)を生成します。 javahにはJDKがインストールされています。
  3. C/C++でネイティブJava関数を実装します。
    1. 検索するクラスjava.awt.image.BufferedImage。
    2. 検索するコンストラクタを使用します。
    3. 指定されたコンストラクタでBufferedImageオブジェクトを作成します。
    4. 検索setPixelメソッド。
    5. 画像内の各ピクセル値を設定する方法を実行します。それを実行する必要があります x 回。
    6. オブジェクトを返します。
  4. 共有ライブラリにコンパイルします。
  5. Javaクラス内に共有ライブラリをロードします。
  6. 共有ライブラリをリンクしていることを示すJavaクラスを実行します。

画像の生データをコピーする方法は他にもありますが、この方法で十分であるはずです。

+0

返信いただきありがとうございます、私は別のやり方でやりました。 – ldog

0

JavaライブラリはPNGをサポートしているので、CからJavaへのすべてのバイトをコピーし、ImageIOクラスを使用するメカニズムを追加します(Chad Okere)。

また、JNAを使用して生活を楽にすることを検討してください(example using JNA to draw a Windows cursor)。

+0

ねえ、 幸い、私は何のためにWindowsを使用していないので、私は、 JNAは使用できません。頭をアップしてくれてありがとう、もし私が窓に戻ったら、それは役に立つと思う。 – ldog

関連する問題