JRubyからJavaを呼ぶ

日本JRubyユーザ会に行ったとき、fujibeeさんのデモに感動したけどこれまでためしてませんでした。
http://fujibee.org/2010/05/22/jruby%E3%83%A6%E3%83%BC%E3%82%B6%E4%BC%9A%E3%81%AE%E6%99%82%E3%81%AE%E3%83%87%E3%83%A2/
で解説をしてくださっているのでやってみます。

まずはJRubyのインストール・・・ですが、俺先日インストールしちゃってたし。。。

インストールの仕方は、普通に
http://jruby.org/
から

JRuby 1.5.0 Windows Executable

というリンク先をクリックしてダウンロードしてダブルクリックしてインストールするだけです。何も考えてません。
fujibeeさんの説明だとrvmってのを使ってますが、使えると思うんですが、今回はjirbを使ってしまおうと思います。


コマンドプロンプトを立ち上げて、以下のように打ちます。

C:\Users\mitsuo>jirb
irb(main):001:0>
irb(main):002:0* require 'java'
=> true
irb(main):003:0> frame = javax.swing.JFrame.new("Hello,JRuby!")
=> #<Java::JavaxSwing::JFrame:0x4e21db>
irb(main):004:0> frame.layout = java.awt.GridLayout.new(5,1)
=> #<Java::JavaAwt::GridLayout:0x1751a9e>
irb(main):005:0> 1.upto(5) do |i|
irb(main):006:1*   frame.add(javax.swing.JButton.new("button #{i}"))
irb(main):007:1> end
=> 1
irb(main):008:0>

ここまでは画面は何も変わりません。
まあ、見れば分かる通り、ここまではオブジェクトを作ってるところまでですね。

irb(main):008:0> frame.visible = true
=> true

これをやると、以下の画面が表示されます。

おぉ、スゲエ。

さらに、続けてこれをやると・・・

irb(main):009:0> frame.set_size(200,300)
=> nil

以下の画面が!!

おぉぉぉ!!スゲエ!!!カッコイイ!!!ボタンをrubyでループ処理で5個出してるあたりがイイですね。


そんで最後は

irb(main):010:0> frame.default_close_operation = javax.swing.JFrame::EXIT_ON_CLOSE
=> 3

これで閉じられるようになりますな。

この「CUIGUIを動かす」という感覚に対して、俺はプラレス3四郎をイメージしました。


さて、こうなると、自分が作ったクラスをJRubyから呼ぶには??ってことをやりたくなります。
http://blogs.wankuma.com/kazuki/archive/2008/09/13/156481.aspx#
にしたがってやってみました。

てかもうAntの使い方忘れてる・・・。
かなり遠回り。


適当にクラス作ってjarにして、上記記事の通りやってみましたが・・

C:\Users\mitsuo>jirb
irb(main):001:0> require 'java'
=> true
irb(main):002:0> require 'SampleApp.jar'
LoadError: no such file to load -- SampleApp
        from c:/jruby-1.5.0/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31
:in `require'
        from c:/jruby-1.5.0/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31
:in `require'
        from (irb):2


ありゃりゃ。例外だ。
include対象のクラスはカレントパスになきゃだめなのかな?と思い、以下のようにやってみた。

C:\jruby-1.5.0>cd lib

C:\jruby-1.5.0\lib>jirb
irb(main):001:0>
irb(main):002:0* require 'java'
=> true
irb(main):003:0> require 'SampleApp.jar'
=> true
irb(main):004:0> include_class('com.bangucs.sample.SampleApp')
=> Java::ComBangucsSample::SampleApp
irb(main):005:0> sampleapp = com.bangucs.sample.SampleApp.new
=> #<Java::ComBangucsSample::SampleApp:0x23d275>

うむ、通ったっぽい。なるほどー。
でも・・・

irb(main):006:0> p sampleapp.greet('aaa')
irb(main):007:1'
irb(main):008:1' p sampleapp.greet("aaaa")
irb(main):009:1'
irb(main):010:1' puts sampleapp.greet('abab')
irb(main):011:1'


なぜか結果が表示されない・・・。というとこで時間切れ。
どうやら命令はきちんと通ってるっぽいので、動くことは動くんだろうと思います。

続きはまた今度。。。