Android上でScalaうごいたよメモ

Eclipseをつかって,Scalaで書いたプログラムをAndroid上で動作させたよ,メモ.というか,以下のポイントに気をつけておけばOKそうです.

ポイント

  • EclipseのScalaプラグインのバージョンに合ったandroid用のscalaライブラリを使う
  • EclipseのBuilderの順番を適切に設定する
  • Eclipseのライブラリの読み込み優先度を適切に設定する

Developing for Android | Scala IDE for Eclipse Project | Assembla をだいぶ参考にしました.

とりあえずやってみよー

0. Eclipseをインストールする

省略.普通にいれる

1. Android開発環境をととのえる

  • Eclipseの環境設定でSDKの場所をセットしておけばOK


2. Scala開発環境を整える

このとき,Scala IDE for Eclipseはnightlyじゃない方をインストールするよう注意.android-library.jarとバージョンを合わせるため. (どっちもバージョン7.5になる)

3. Androidプロジェクトを作成し,Scalaライブラリをしこむ

ここが面倒

  • Package Exploreを右クリックして New->Other から Android Projectを選択.ウィザードをすすめて新しいプロジェクトを作る.(ウィザードの例 f:id:hakobe932:20090706171311p)
  • プロジェクトの名前を右クリックして Scala->Add Scala Natureを選んでScala環境を追加する
  • プロジェクトのProperties->Java Build Path の Libraries タブで Scala Library を Remove
  • 同じLibraries タブで Add External JARs... を選択して先ほど用意したandroid-library.jarを指定する.
  • さらにLibraries タブで Add External Class Folder... を選択してプロジェクト内のbinディレクトリを指定する.以下は,ここまでのLibraryタブの様子.


  • Order and Export タブを以下のような順番に並べ返る


  • プロジェクトのProperties->Builders を以下のような順番に並べ替える


4. Scalaのコードを用意

  • Eclipseによって自動的に作成されたActivityクラスを削除する
  • 同じ名前のscalaファイルをつくる.もともとHoge.javaが生成されていたらHoge.scalaをつくる.コードは例えば以下のように
package jp.hakobe.mobile

import android.os.Bundle
import android.app.Activity
import android.widget.TextView

class Hoge extends Activity {
    override def onCreate(savedInstanceState: Bundle) {
    	super.onCreate(savedInstanceState)
    	val tv = new TextView(this)
    	tv.setText("Hello Android, it's me, Scala!")
    	setContentView(tv)
	}
}

5. ビルドと実行

Run Configuration を設定する

  • Androidタブで今作ったプロジェクトを指定する
  • TargetタブでAndroid Virtual Deviceを作っておく
  • CommonタブでLaunch in backgroundのチェックをはずす

Runで実行.Androidのエミュレータが立ち上がってHello, World的プログラムが実行されると成功です.

まとめ

このように,EclipseでScalaを動作させるには,星の数のようなバッドノウハウをくぐりぬける必要があり,なかなかたいへんでした.一度動作させるとおおむね快適に利用できそうです.

バッドノウハウの多くがEclipse関係だったので,Eclipseに慣れない人は,コマンドラインでSDKたたいて開発したほうがはまったときに自分でなんとかしやすいかもしれないですね.vimで開発できるようそのあたりも調べてみたいです.

ところで,AndroidでScalaを動作させる真の目的としてはactorの利用があったのですが,まだためせてません.なんかAndroidだとThreadの扱いがいろいろ特殊っぽい?