JRubyをAndroidで動かしたい
JRubyをAndroid上で動かして、Android上でRubyで作ったアプリを動かしたいなと思いやってみているのですが、上手くいかない。
ドキュメントはあるのですが、修正箇所がわからず詰まっているというへたれっぷり。
JRubyはHome — JRuby.orgから1.3.0を
Android SDKはAndroid 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を展開しました。
まず、JRubyをAndroid上で動かすために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)とリリースノートに書かれていたのでここのエラーは出ないと思ったんだけどなぁ。
やり方がまずいのかな。