[[How2Computing]]

-関連トピックス
--[[Mac OS X の Xcodeでライブラリを作る:http://is.ocha.ac.jp/~siio/index.php?How2dylib]]
--[[Windwos Visual Studio 2010 のC++で動的ライブラリ dll を作る:http://is.ocha.ac.jp/~siio/index.php?How2dll]]
--[[Windwos Visual Studio 2010 で静的ライブラリ lib を作る:http://is.ocha.ac.jp/~siio/index.php?How2lib]]
//--[[ccで作ったライブラリ(dylib)をJava (JNA) から使う(Mac OS X 編)::http://is.ocha.ac.jp/~siio/index.php?How2lib]]

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

**まずはCの標準ライブラリを使ってみる [#db29f231]

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から使う [#nae312e8]

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