uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

Groovy on android by discobot

f:id:uehaj:20100515232705p:image:right:medium

Android上でgroovyを動かすには、discobotというものを使います。これはGroovyに対するパッチ群を中心としたもののようです。

準備

JDK,Android SDKをインストールしておきます。Eclipse plugin(ADT plugin for eclipse)は使わない方向で。

  • ダウンロード

discobotを以下からダウンロード。

Groovy(1.6.4)のソースを含んでいるので結構でかい。
というフォルダに展開するとします。

  • /project.confにandroid SDKのフォルダを設定

android-folder:/tool/android-sdk-mac_86

  • 配下の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アプリを作る

$ 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

  • 動いた!!!

f:id:uehaj:20100515224726p:image

でも日本語化けてるじゃんかorz
直し方良く分からないから手っ取り早くソースにnative2asciiかけてもう一度トライ。

f:id:uehaj:20100515225319p:image

直った!

実機で

最後にXperiaに転送してみます。

f:id:uehaj:20100515232705p:image

特に問題はないようです。