RubyJavaBridge?(RJB)とは

RubyからJavaの機能を呼び出すライブラリです。artonさん作。→本家

  • mswin32
    • ActiveScriptRubyに同梱されているrjb.soを使うのが楽です。Javaが入っていて環境変数JAVA_HOMEが設定されていれば、そのまま動くはず。
    • JAVA_HOMEはC:¥Program Files¥Java¥j*re*とかそのへんに。
    • ちなみにソースからビルドしたらセグフォりました。VC7.1だとだめなのかも。
  • cygwin
    • Cygwinでrjbをコンパイルする方法に従えばビルドできます。
    • ただしJDKのパスに半角スペースが入ってるとだめっぽいので、その場合はinclude以下だけ別の場所にコピーして、そっちをJAVA_HOMEに指定してビルドすればOKです。
  • darwin (Mac OS X)
    • 本家の手順でビルドすればOKです。
    • JAVA_HOMEは/Library/Java/Homeです。
    • LD_LIBRARY_PATHの設定は要らないようです。

RJB Plus

RJBの機能をもっと便利に呼び出すために、追加のメソッドなどを定義したRubyスクリプト。まだろくにテストしてないのでバグがあるかも。

rjbplus.rb

以下の機能を追加しました。使い方はソース中のコメントやswt_sample.rbを見てください。

  • rjb_import: Javaのimport文相当。ワイルドカード(〜.*)も使える。
  • Rjb.bind(obj, "Interface") の代わりに Interface[obj] と書ける。
  • Javaの new Interface{ … } っぽい構文。

RJB + SWT

RJBに触ったのは、RubyでSWTを使えないかなぁ、と思ったからです。cygwinとmswin32でちょっと試した範囲では、問題なく使えてます。

Mac OS Xでも動きました。あっさり成功してびっくり。

サンプル

swt_sample.rb ボタンを押すとメッセージボックスが出るサンプル。

サンプルを動かすのに必要なもの

  • RJB
  • rjbplus.rb
    • カレントディレクトリに。
  • SWT
    • SWTのページから自分の環境用のSWTをダウンロードして解凍。
    • swt.jarとswt-*.dll*1をカレントディレクトリにコピー。

対応するJavaのサンプル

SWTSample.java

Javaでこんなmain()にだらだら書いたら怒られるでしょうけど…。

注意点

Java側から呼ばれたRuby側の処理(上のサンプルのwidgetSelectedの部分とか)で例外が起きると、黙殺されるようです。対応策は、なんか怪しいと思ったらrubyに-dオプションをつけてみるぐらいでしょうか。ちなみに-dをつけると、rjbplus.rbの中でNoClassDefFoundError?が起きてるのが見えますが、こっちは無視してください。

あと、Javaのメインスレッド以外からRuby側の処理が呼ばれるとまずいらしいです。SWTのイベントハンドラはメインスレッドで呼ばれるっぽいのでその点は大丈夫…かな?

逆にRubyの別スレッドからRJBを呼んだりするとどうなるのかは知りません。問題ないのかな。

コメント



*1 Windowsの場合。Macだとswt-*.jnilib。

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-01-06 (金) 11:43:31 (4668d)