« Portable Ubuntu試し Main JMF: JMStudioでRTP試し »

JavaでJNAを使う

JavaからOpenCVをJNA (Java Native Access) 経由で使う野望の続き:

以下から jna.jarの最新版を入手

これを適当なライブラリパス(Windows なら C:\Program Files\Java\JNA\ など)におき、環境変数 CLASSPATH に jna.jar まで含めた形でC:\Program Files\Java\JNA\jna.jarなどと指定する。Windows の場合は、コントロールパネル→システム→詳細設定→環境変数で、CLASSPATHを新規追加あるいは既存のものを編集:

これでネイティブライブラリがNative.loadLibrary()を使って読み込めるようになる。形式は以下のようになる。

クラス名 INSTANCE=(クラス名)Native.loadLibrary("ライブラリ名", クラス名.class);

「クラス名」は、そのライブラリ内容に沿ったものを適当に指定する。

実際の呼び出しでは次のようにLibraryを継承したインターフェースを作成する (com.sun.jna.examples.win32パッケージなどを利用する場合は、StdCallLibraryを継承する)

interface クラス名 extends Library {
  // ここに上記のライブラリ読み込みを記述

  // ライブラリの各関数へのインターフェースを以下に並べていく
}


以下は、user32.dll を使ってMessageBoxを出す例

import com.sun.jna.Library;
import com.sun.jna.Native;

interface User32 extends Library {
  // インスタンス生成
  User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);

  // 関数へのインターフェース
  int MessageBoxA(int hWnd, byte[] lpText, byte[] lpCaption, int uType);

  // 定数定義
  int MB_YESNO = 0x00000004;
  int MB_ICONASTERISK = 0x00000040;
}

public class MessageBoxSample {
    public static void main(String[] args) throws Exception {
      User32 user32=User32.INSTANCE;
      user32.MessageBoxA(0, _T("終了しますか?"), _T("終了確認"), 
                                         User32.MB_ICONASTERISK | User32.MB_YESNO);
    }

    // マルチバイト文字列を返す。
    private static byte[] _T(final String str) throws Exception {
      return (str+"\0").getBytes("Windows-31J");
    }
}

[追記]
リンク更新

Leave a comment

Your comment