前田です。 In message "[ruby-list:4391] Re: ruby seminar" Eiji-usagi-MATSUmoto <ematsu / pfu.co.jp> wrote: |うさぎ@勤務地は西田幾太郎生誕の地です。 おお、実は今西田の講義を受けています。 |> P.S.樋口さんの講演で、Javaとのインターフェイスを作る話を |> 思い出してJNI使ってちょこちょこ書いています。 |> やっとJavaのオブジェクトを生成したり、メソッドを呼び出し |> たりできるようになったのですが、なぜか途中でクラスが |> すりかわっていたりして悩んでます(^^; | |おっと、すごいですねぇ。私もつらつらと考えていたんですが、 |どうやって実現していいのかさっぱりわかりません。 Java Native InterfaceとReflection APIを使って書きました。 Cだけでは難しそうだったので、少しJavaでもコードを書いています。 とりあえず動くようになったので、 http://www.aianet.ne.jp/~shugo/ruby/jri/jri-a0.tar.gz に置いておきます。 もう少しちゃんとしたのが出来たらjavahouseにもアナウンスし たいと思います。 |既に、Python, tclなんかがJavaインタフェースを持ってるんで |すよね。 tclは知りませんでした。 PyJavaというのは取ってきたんですけど、自動生成で作った ソースでしかもC++のようだったので、ソースを読むのは 断念しました(^^; もう一つJPIというのもあったんですが、そちらはソースが ないみたいですね。 |おもしろそうだなぁと思いつつ、一つの言語の中に他の言語が |いりまぢるのは、きれいぢゃないかもしれないと思ったりもす |るんですが、うまいインタフェースを持つことによって、上手 |に融合できるものなのかもしれませんね。 あくまでrubyのクラスとしてJavaのクラスを扱うので、ユーザー から見れば普通のrubyオブジェクトに見えるようになっています。 こんな感じです。 JAVA:--------------------------------------------------------- public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; count++; } public void say() { System.out.println("My name is " + name + "."); System.out.println("I'm " + age + " years old."); } } ruby:--------------------------------------------------------- require 'java' Person = Java.find_class("Person") tom = Person.new("Tom", 10) tom.say -------------------------------------------------------------- 実行結果は My name is Tom. I'm 10 years old. となります。 一旦find_classで取り出したクラスはrubyのクラスとして扱える ので普通に継承することも可能です。 でも現状ではまだ配列を扱えないのと、Javaのイベントモデルに対応 できないという問題があるので、あまり使えないです(^^; # やっぱりJavaからrubyを呼べるようにしないといけないん # でしょうね...。 -- 前田 修吾