« 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()を使って読み込めるようになる。形式は以下のようになる。
[code]
クラス名 INSTANCE=(クラス名)Native.loadLibrary("ライブラリ名", クラス名.class);
[/code]
「クラス名」は、そのライブラリ内容に沿ったものを適当に指定する。

実際の呼び出しでは次のようにLibraryを継承したインターフェースを作成する (com.sun.jna.examples.win32パッケージなどを利用する場合は、StdCallLibraryを継承する)
[code]
interface クラス名 extends Library {
// ここに上記のライブラリ読み込みを記述

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

以下は、user32.dll を使ってMessageBoxを出す例
[code]
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");
}
}
[/code]

リンク

[追記]
リンク更新

Leave a comment

Your comment