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");
}
}リンク
- jna: Java Native Access (JNA): Pure Java access to native libraries
- JNAなるもの – こげつきません
- JNIより簡単にJavaとC/C++をつなぐ「JNA」とは(1/4)-@IT
- mono’s Tech Blog » JNIよりずっとお手軽なJNA(Java Native Access)
- JNAを使ってメッセージボックス表示 – CamelCaseの日記
- 八角研究所 : Javaでネィティブアクセス
- Javaの応用:Felicaカードリーダ – 亜大用授業資料サイト
- JNA meets JNI | A Java geek
- OpenCV+JavaでMMD(実験中)‐ニコニコ動画(ββ)
[追記]
リンク更新