SWIG を使ってみよう! [第2回] Java 編2008年09月08日 20時24分51秒

SWIG を使って libnmz の様々な言語用のバインディングを作成してみましょう。

今回は UNIX 環境(Linux)で Java から libnmz の nmz_get_version を呼び出すことを考えます。

モジュール名は前回と同じ Sample とします。 SWIG 用インターフェイスファイルを Sample.i という名前で作成します。 中身は前回と全く同じです。

%module Sample
%{
#include "namazu/libnamazu.h"
%}
char *nmz_get_version();

swig コマンドを使ってラッパ用コードを生成します。 今回は Java 用ですので引数に -java を指定します。

$ swig -java Sample.i

実行すると Java 用の Sample_wrap.c と Sample.java, SampleJNI.java が生成されます。 (JNI を用いて C ライブラリを呼び出します。)

javac で Sample.java, SampleJNI.java をコンパイルします。

$ javac Sample.java SampleJNI.java

Sample.class, SampleJNI.class が生成されます。

次に Sample_wrap.c をコンパイルします。 (ここでは Linux + J2sdk1.4.2_18 での例をしめします。)

$ gcc -c Sample_wrap.c -I /usr/java/j2sdk1.4.2_18/include 
       -I /usr/java/j2sdk1.4.2_18/include/linux
$ gcc -shared Sample_wrap.o -o libSample.so -L /usr/local/lib -lnmz

Java バインディングの Sample モジュール(Sample ライブラリ)が作成されました。

インストールして使うこともできますが、ここではカレントディレクトリに生成したライブラリをそのまま使ってみましょう。

Sample ライブラリを呼び出す Java プログラム を main.java という名前で作成します。

public class main {
  static {
    try {
        System.loadLibrary("Sample");
    } catch (UnsatisfiedLinkError e) {
      System.err.println("Native code library failed to load. See 
          the chapter on Dynamic Linking Problems in the SWIG Java 
          documentation for help.\n" + e);
      System.exit(1);
    }
  }

  public static void main(String argv[])
  {
    // Print out the value of some enums
    System.out.println(Sample.nmz_get_version());
  }
}

このプログラムは nmz_get_version の値を表示するだけの単純なプログラムです。 コンパイルして main.class を生成します。

$ javac main.java

実行すると、Namazu のバージョンが表示されます。 カレントディレクトリにある Sample ライブラリを利用するため、引数でパスを指定しています。

$ java -Djava.library.path=. -cp . main
2.0.18

非常に簡単な例ですが、SWIG を使って libnmz を Java から利用する方法をしめしました。 モジュールの生成方法は各言語ごとに異なりますが、 Perl の時に使ったものと同じインタフェースファイルから作成できることが分かったかと思います。 他の言語でも同じように利用することができますので、いろいろと工夫してみてください。

[お断り]

  • SWIG Version 1.3.36 を使用しました。
  • java version "1.4.2_18" を使用しました。
  • Namazu 2.0.18 を使用しました。
  • libnmz は GPL ライセンスです。libnmz を動的であれ、静的であれリンクして使用するプログラムは GPL ライセンスと 矛盾しないライセンスである必要があります。
  • SWIG を用いて作成した Sample モジュールは libnmz をリンクしますので、GPL ラインセンスとして公開します。
  • Sample モジュールは GPL ライセンスですので、Sample モジュールを利用するプログラムは GPL ライセンスと矛盾しないライセンスでなければなりません。ご注意ください。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://namazu.asablo.jp/blog/2008/09/08/3751471/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。