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(実験中)‐ニコニコ動画(ββ)
[追記]
リンク更新