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
これで閉じられるようになりますな。
この「CUIでGUIを動かす」という感覚に対して、俺はプラレス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'
なぜか結果が表示されない・・・。というとこで時間切れ。
どうやら命令はきちんと通ってるっぽいので、動くことは動くんだろうと思います。
続きはまた今度。。。