How2Computing

ccで作ったライブラリ(dylib)をJava (JNA) から使う(Mac OS X 編)

まずはCの標準ライブラリを使ってみる

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を付けたファイルを見ていると思われる))

Mac OS Xのccで作ったダイナミックライブラリをJavaから使う

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


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-10-23 (火) 10:44:02 (1855d)