http://www.hakkaku.net/hakkaker_blog/20090211-378
などに説明あり。これらによると、Mac OS Xならば、
https://github.com/twall/jna
からjna.jarをダウンロードして、
/System/Library/Java/Extensions/
に入れて、以下のプログラムをjavacでコンパイルしてjavaで動かすと、 C言語の標準ライブラリからprintfが呼び出せる。
import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Platform; public class HelloJNA { //標準Cライブラリのインターフェース public interface CLibrary extends Library { // インスタンス定数 CLibrary INSTANCE = (CLibrary) Native.loadLibrary("c", CLibrary.class); //printfの定義 void printf(String format, Object... args); } public static void main(String[] args) { CLibrary c = CLibrary.INSTANCE; c.printf("Hello JNA!!\n"); } }
これはどうやら
/usr/lib/libc.dylib
を呼び出しているのかと思われる。 (ソースコードの中ではcとしか書いていないけど、参照するのはlibc.dylibになるらしい。頭にlib、尻尾に.dylibを付けたファイルを見ていると思われる))
libmydylib.cというファイルに以下のソースを書く。 (生成する.dylibの名前がlibで始まる必要があるらしいのでソースファイル名もそれに合わせておくことにした。)
int myadd(int a, int b) { return a+b; }
これをコンパイルしてdylibを作る。
cc -dynamiclib -o libmydylib.dylib libmydylib.c
次に、Javaからこのライブラリで作った関数を呼び出すプログラムを書いてみる。
import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Platform; public class TestMylib { public interface CLibrary extends Library { CLibrary INSTANCE = (CLibrary) Native.loadLibrary("mydylib", CLibrary.class); int myadd(int a, int b); } public static void main(String[] args) { CLibrary mylib = CLibrary.INSTANCE; System.out.println(mylib.myadd(20,22)); } }
コンパイルして実行。
$ javac TestMylib.java $ java TestMylib 42
人生、宇宙、すべての答えは42