Java Native Access 〜その1〜

Java Native Access (JNA) とは

JNA とは、Javaからネイティブライブラリを簡単に使用するためのライブラリです。通常Javaからネイティブライブラリを呼び出す場合は、JNIを利用しますが、Cヘッダファイルの作成が必要であったりと手順が煩雑でした。JNA を利用すると、追加のコード生成が不要となり、実行時にダイナミックにネイティブライブラリを呼び出すことができます。
以下のサイトにより提供されており、ライセンスはLGPL(バージョン2.1以降)となっています。
https://jna.dev.java.net/

JNAライブラリのダウンロード

JNA のライブラリは単一のjarファイルとして提供されています。jarファイルの中には各プラットフォームに対応したネイティブライブラリ(例えばjnidispatch.dll)が含まれており、実行環境上での設定は特に必要ありません。

本家サイトよりjna.jarをダウンロードしてクラスパスに追加します。今回は、現時点での最新版である 3.2.4 を使用します。

簡単なサンプルの実行

ここではプラットフォームが Windows である前提とします。以下の HelloWorld を実行してみます。このサンプルでは標準Cライブラリの printf の呼び出しを行っています。

package etc9;

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

public class HelloWorld {
    public interface CLibrary extends Library {
        CLibrary INSTANCE = (CLibrary)
            Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
                               CLibrary.class);
    
        void printf(String format, Object... args);
    }

    public static void main(String[] args) {
        CLibrary.INSTANCE.printf("Hello, World\n");
    }
}

実行すると、「Hello World」が表示されます。JNI と比べると驚くほど簡単ですね。