小澤さくです.

お知らせ:

前田さんのruby FAQをLinuxdoc-sgml-1.5で書きなおしてみました.
        <ftp://ftp.netlab.co.jp/incoming/rubyfaq.sgml.tar.gz>
として置いてあります.中身はsgmlソースとdvi,htmlです.
        <http://www.shiojiri.ne.jp/%7Ecrouton/ruby/>
にも転がしてあります.
# 前田さんの許可はいただいてあります.

In article <199709180652.PAA00353 / soleil.aianet.ne.jp>,
    shugo / po.aianet.ne.jp (MAEDA Shugo) writes:

shugo> P.S.樋口さんの講演で、Javaとのインターフェイスを作る話を
shugo>     思い出してJNI使ってちょこちょこ書いています。
shugo> Java Native InterfaceとReflection APIを使って書きました。
shugo> Cだけでは難しそうだったので、少しJavaでもコードを書いています。

私もJPIなどを目にして,これ(Java-ruby-interface)の実現をもくろんでいる
のですが,思い立った矢先にペンティアムマシンが壊れてしまい修理中なもの
で,放置状態でした.現在使用している486DX/33MHz 16MB RAMじゃぁさすがに
Java関連の開発は辛いです.
# 一応JNIのドキュメントはいくらか読んでましたが.

今のところ,ぜんぜん実装に手をつけずに悩むばかりです.
考えていたアプローチは前田さんと似たようなものです.

手をつける前から気付いてる問題点は

・プリミティブタイプとそのラッパクラスをrubyで区別する方法
・長さの違う数値タイプをrubyにマッピングする方法
・配列の扱い
  とくに多次元
・無名クラスの扱い
・インターフェイスの扱い
  MixInとして扱う?
  イベントリスナのことを考えると,直接newしたときにはObjectのサブ
  クラスになるようにnewを再定義する必要もあるな.

あたりです.

できあがった暁のコードイメージはこんな感じです.

require 'java'

Frame = Java.find_class('java.awt.Frame')
Button = Java.find_class('java.awt.Button')
ActionListener = Java.find_class('java.awt.event.ActionListener')
BorderLayout = Java.find_class('java.awt.BorderLayout')

class MyFrame < Frame
    def initialize(title)
        super
        setLayout(BorderLayout.new)
        @button = Button.new('Click me')
        al = ActionListener.new
        def al.actionPerformed(event, object)
            print "ouch!\n"
        end
        @button.addActionListener(al)
        # 注目しているjava interfaceがメソッドを1つしかもたないことが
        # わかっている場合に以下のようにも書けることにすると嬉しいか?
        # @button.addActionListener(ActionListener.new {
        #     |event, object| print "ouch!"
        # })
        # あれ? instance initializerはどうすんだ?
        add('Center', @button)
        pack
    end
end

$frame = MyFrame.new
$frame.show

先は長そう.

とりあえずマシンの修理待ちです.
いえね,一度は戻ってきたんですけど,直ってなかったんで文句を言ったんで
すよ.そしたら交換してくれることになりまして^^;
--
小澤索郎@塩尻Internet
<mailto:crouton / po.shiojiri.ne.jp>
<http://www.shiojiri.ne.jp/%7Ecrouton/>