前田です。

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を呼べるようにしないといけないん
# でしょうね...。

-- 
前田 修吾