まめ畑

ゆるゆると書いていきます

JRubyをAndroidで動かしたい

JRubyAndroid上で動かして、Android上でRubyで作ったアプリを動かしたいなと思いやってみているのですが、上手くいかない。
ドキュメントはあるのですが、修正箇所がわからず詰まっているというへたれっぷり。


JRubyHome — JRuby.orgから1.3.0を
Android SDKAndroid 1.5 SDK, Release 2 | Android DevelopersからWindows-1.5 RC2を
使用しています。
参考にしたサイトはこちらHeadius: Ruboto Is Your Friend
Android SDKのインストールとDeviceの設定はAndroid1.5ためしてみた - まめ畑を参照してください。
JRubyは古い記事ですがJRubyを入れてみた - まめ畑のバージョンのところを適時読替えて設定して下さい。
今回は「z:\」直下にAndroid SDKを展開しました。


まず、JRubyAndroid上で動かすためにDalvikバイトコードへ変換する必要があります。
Androidではdalvikvm上で動作させるので、dalvikvmが理解出来るコードへ変換します。
変換に使用するdxコマンドは

Z:\android-sdk-windows-1.5_r2\platforms\android-1.5\tools\dx.bat

を使用します。
使用出来るパラメータはヘルプを参照してください。


先ほどの参考ページでは

dx -JXmx1024M --dex --output=ruboto.jar jruby.jar

の様にヒープサイズを指定していますが、なぜかこれでは上手い事メモリが確保出来ずに変換中にヒープエラーが出ました。


なので、「dx.bat」の42行目を

set javaOpts=
から
set javaOpts=-Xmx1024M

に変更します。

この後

#jruby.jarはjrubyディレクトリ配下のlibディレクトリ内にあります
dx --dex --output=ruboto.jar jruby.jar

とすると

warning: Ignoring InnerClasses attribute for an anonymous inner class that doesn
't come with an associated EnclosingMethod attribute. (This class was probably p
roduced by a broken compiler.)

と警告を吐きまくりながら変換されて出力されました。(大丈夫なのか・・・)


Androidエミュレータに転送するには、先のAndroidの記事中のDeviceの作成をまず行って下さい。
エミュレータの起動方法は

emulator @Devece_Name

です。


別のコンソールを立ち上げて

adb push ruboto.jar data/ruboto.jar

と実行します。


後は

adb shell

でShellを実行して、その中で

dalvikvm -Xss128k -classpath data/ruboto.jar org.jruby.Main -e "puts 'JRuby on Android'"

と実行すると動くはずなのですが

HugeEnumSet.java:102:in `next': java.lang.ArrayIndexOutOfBoundsException
        from HugeEnumSet.java:52:in `next'
        from ConstantResolver.java:107:in `getConstant'
        from ConstantResolver.java:146:in `intValue'
        from Errno.java:93:in `value'
        from Ruby.java:1275:in `initErrno'
        from Ruby.java:1247:in `initExceptions'
        from Ruby.java:992:in `bootstrap'
        from Ruby.java:969:in `init'
        from Ruby.java:172:in `newInstance'
        from Main.java:202:in `run'
        from Main.java:113:in `run'
        from Main.java:97:in `main'
        from NativeStart.java:-2:in `main'

とエラー。


これは参考記事にも書かれているエラーなのですが、解決策としてこの箇所をコメントアウトするとを書かれています。
この箇所をソースでコメントアウトして、jarに固めなおして変換して再チャレンジ中です。
記事ではirbも動いている模様ですね。


JRuby1.2で Preliminary android support (Ruboto)とリリースノートに書かれていたのでここのエラーは出ないと思ったんだけどなぁ。
やり方がまずいのかな。