Rhino 1.6R7 を MinGW の gcj でコンパイル
mozilla.org による Java で書かれた JavaScript の処理系である Rhino 1.6R7 を MinGW の gcj でコンパイルして Windows 用のバイナリを作ってみました.
- http://cefiro.homelinux.org/memo/2007-10-03/ - コンパイル手順
- http://cefiro.homelinux.org/memo/2007-10-03/rhino-1.6R7-win32.zip - Windows 用バイナリ
MinGW の gcc-3.4.2 に含まれている gcj でネイティブコードにコンパイルされて DLL などに格納されたクラスを動的にロードする方法がよくわからないのでいろいろ困りました.
Rhino のような Java ベースの言語処理系で Java のクラスを使う場合は普通 Reflection API 経由でクラスをロードします.しかし gcj でコンパイルする場合,インタープリタをコンパイルする時点ではクラスへの明示的な参照がないのでクラスがリンクされません.
UNIX 上の gcj のランタイムはその辺を上手いこと *1やってくれるようになっているのですが MinGW では上手くないようです.
しかたがないので使えそうな標準ライブラリへの参照を無理矢理作って全部インタープリタにリンクしてしまいました.全部といっても MinGW の gcj 附属の libgcj は未実装の API が多数*2なので とりあえずそこそこ動きそうな以下のパッケージのクラスだけをリンクしています.
- java.nio
- java.nio.channels.spi
- java.nio.channels
- java.nio.charset.spi
- java.nio.charset
- java.math
- java.lang
- java.lang.ref
- java.lang.reflect
- java.io
- java.util.logging
- java.util.jar
- java.util
- java.util.zip
- java.util.prefs
- java.util.regex
- java.net
- java.text
リンクしているクラスの中でも正しく動かないクラスが結構あると思いますがまぁ気にしない方向で… コマンドラインから JavaScript で遊ぶ程度ならそこそこ動くはずですし…