#contents *RubyJavaBridge(RJB)とは [#of5dba27] RubyからJavaの機能を呼び出すライブラリです。artonさん作。→[[本家:http://arton.no-ip.info/collabo/backyard/?RubyJava%A5%D6%A5%EA%A5%C3%A5%C2]] -mswin32 --[[ActiveScriptRuby:http://arton.hp.infoseek.co.jp/indexj.html]]に同梱されているrjb.soを使うのが楽です。Javaが入っていて環境変数JAVA_HOMEが設定されていれば、そのまま動くはず。 --JAVA_HOMEはC:¥Program Files¥Java¥j*re*とかそのへんに。 --ちなみにソースからビルドしたらセグフォりました。VC7.1だとだめなのかも。 -cygwin --[[Cygwinでrjbをコンパイルする方法:http://arton.no-ip.info/collabo/backyard/?HowToBuildRjbOnCygwin]]に従えばビルドできます。 --ただしJDKのパスに半角スペースが入ってるとだめっぽいので、その場合はinclude以下だけ別の場所にコピーして、そっちをJAVA_HOMEに指定してビルドすればOKです。 -darwin (Mac OS X) --本家の手順でビルドすればOKです。 --JAVA_HOMEは/Library/Java/Homeです。 --LD_LIBRARY_PATHの設定は要らないようです。 *RJB Plus [#u74088dc] RJBの機能をもっと便利に呼び出すために、追加のメソッドなどを定義したRubyスクリプト。まだろくにテストしてないのでバグがあるかも。 [[rjbplus.rb:http://gimite.ddo.jp/gimite/rubymess/rjb/rjbplus.rb]] 以下の機能を追加しました。使い方はソース中のコメントや[[swt_sample.rb:http://gimite.ddo.jp/gimite/rubymess/rjb/swt_sample.rb]]を見てください。 -rjb_import: Javaのimport文相当。ワイルドカード(〜.*)も使える。 -Rjb.bind(obj, "Interface") の代わりに Interface[obj] と書ける。 -Javaの new Interface{ … } っぽい構文。 *RJB + SWT [#m8a3d962] RJBに触ったのは、RubyでSWTを使えないかなぁ、と思ったからです。cygwinとmswin32でちょっと試した範囲では、問題なく使えてます。 Mac OS Xでも動きました。あっさり成功してびっくり。 **サンプル [#rf637311] [[swt_sample.rb:http://gimite.ddo.jp/gimite/rubymess/rjb/swt_sample.rb]] ボタンを押すとメッセージボックスが出るサンプル。 ***サンプルを動かすのに必要なもの [#rf11d91b] -RJB -[[rjbplus.rb:http://gimite.ddo.jp/gimite/rubymess/rjb/rjbplus.rb]] --カレントディレクトリに。 -SWT --[[SWTのページ:http://www.eclipse.org/swt/]]から自分の環境用のSWTをダウンロードして解凍。 --Windowsの場合だと、swt.jarとswt-win32-3139.dllをカレントディレクトリにコピー。 --swt.jarとswt-*.dll((Windowsの場合。Macだとswt-*.jnilib。))をカレントディレクトリにコピー。 ***対応するJavaのサンプル [#d54ee913] [[SWTSample.java:http://gimite.ddo.jp/gimite/rubymess/rjb/SWTSample.java]] Javaでこんなmain()にだらだら書いたら怒られるでしょうけど…。 **注意点 [#y62d8f70] Java側から呼ばれたRuby側の処理(上のサンプルのwidgetSelectedの部分とか)で例外が起きると、黙殺されるようです。対応策は、なんか怪しいと思ったらrubyに-dオプションをつけてみるぐらいでしょうか。ちなみに-dをつけると、rjbplus.rbの中でNoClassDefFoundErrorが起きてるのが見えますが、こっちは無視してください。 あと、Javaのメインスレッド以外からRuby側の処理が呼ばれるとまずいらしいです。SWTのイベントハンドラはメインスレッドで呼ばれるっぽいのでその点は大丈夫…かな? 逆にRubyの別スレッドからRJBを呼んだりするとどうなるのかは知りません。問題ないのかな。 *コメント [#s67d45f9] #comment