Groovy on android by discobot
Android上でgroovyを動かすには、discobotというものを使います。これはGroovyに対するパッチ群を中心としたもののようです。
準備
JDK,Android SDKをインストールしておきます。Eclipse plugin(ADT plugin for eclipse)は使わない方向で。
- ダウンロード
discobotを以下からダウンロード。
Groovy(1.6.4)のソースを含んでいるので結構でかい。
配下のlib/Utils.groovy,lib/Merge.groovy,discobot-project/build.xmlを修正
フォルダ名である「android-1.5」のところを、対応するバージョン(discobotの指定に合わせて1.5でいいかと思われる)のフォルダのプラットフォームのフォルダ名に修正しておく(android-3)。ここら辺、環境に依存するかもしれません。
discoroidのビルド
以下でパッチあてとビルドが実行されます。libs/discoroid.jarができればOK。
$ cd
$ ./merge.sh clean
私のところではgroovy-coreのビルド時にbndの特定バージョン(bnd-0.0.323.jar)の解決にMavenが失敗しました。Mavenのレポジトリから削除されているようです。これは過去のバージョンのgroovyのコンパイルで使っているものだと思われ、手元に過去にgroovyをコンパイルしたフォルダに同じものがあった(groovy-1.6.4かgroovy-1.7-beta-1で使っていたようだ)ので手動でインストール。
$ mvn install:install-file -DgroupId=biz.aQute -DartifactId=bnd -Dversion=0.0.323 -Dpackaging=jar -Dfile=/tool/groovy-1.6.4/target/lib/tools/bnd-0.0.323.jar
Androidアプリを作る
- Androidプロジェクト作成
$ cd
$ ./mkProject.sh -path ~/proj -name org.jggug.sample.Main
~/projに雛形が作られます。雛形に含まれるGroovyソースは以下のようなものです。(日本語のところは追加しました)
package org.jggug.sample import android.app.Activity; import android.os.Bundle import android.widget.TextView public class Main extends Activity{ /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState) TextView tv = new TextView(this) def list = ["Welcome","to", "discobot." , "\nAnd", "good", "luck", "with", "Main!", "日本語もOK。"] def str = "" list.each { str += it + " " } tv.setText(str) this.setContentView(tv) } }
- Androidプロジェクトのビルド
$ cd ~/proj
$ export CLASSPATH=libs/discobot.jar
$ ant
コンパイルには相当の時間がかかります。groovyのランタイムを全部dexしてるからですね。
アプリサイズは以下の通り:
$ ls -la bin/*.apk
- rw-r--r-- 1 uehaj staff 1587649 5 15 22:49 bin/Main-debug.apk
できたらあとは普通に
- AVDを作って
$ android create avd --name sdk1.5 --target 3
- エミュレータの起動
$ emlator-avd sdk1.5
- インストール
$ adb install bin/Main-debug.apk
- 動いた!!!
でも日本語化けてるじゃんかorz
直し方良く分からないから手っ取り早くソースにnative2asciiかけてもう一度トライ。
直った!