Scala + Eclipse + Android → 書き直す前Ver

http://d.hatena.ne.jp/vvakame/20100127 として書き直しました。そちらをご覧ください。

書き直す前

http://www.scala-lang.org/node/160

上記を参考に頑張ってみる。
環境はMac OS X 10.6 + Eclipse 3.5
AndroidSDKとADPは既に入ってる状態。

だめパターン

svn co http://lampsvn.epfl.ch/svn-repos/scala/scala/trunk scala

リビジョン20673だった

cd scala
cp -ir src/android-library/scala src/library/
ant

ここまでやって、

For Scala 2.7.0 you can download the android-library with sbaz and skip the next section.

って書いてあるのに気がつく。今までの全部ぽいっとする。

がんばりなおし

Scalaは既にMacPortsで入れてある。scala @2.7.7_0 (active)
Scalaにはsbazっていう、CPANとかRubyGems的なものがあるのね... 知らなかった。

sbaz installed

scala-android入ってないか確認。当たり前だけど入ってない。

sbaz available | grep android

で確認。あった。scala-android (2.7.0-final, 2.6.1-final)

sbaz install scala-android

普通に失敗した。

sudo sbaz install scala-android

ごめんなさい。

sbaz installed

確認。OK。
Eclipse起動して、Androidプロジェクトを作成した。
で、説明の通りScalaファイル作ろうとしてファイルが作れない。先にScalaプラグイン入れてないといけなかったのね...。

http://www.scala-lang.org/scala-eclipse-plugin

こっちからプラグイン突っ込んで、面倒くさいけど素のScala使ったプロジェクトがちゃんと動くか確認。
...動かなかった\(^o^)/ で、色々いじくってたらあるとき動くようになった。何やったら動いたかわかんない... orz

で、書いてある通りにAndroidプロジェクトを右クリックしてScalaScalaネイチャーの追加したらJavaビルダーがぽいされた。おぉぅ...。とりあえずこの時点で一回起動してみる。Hello World, HelloJava! と表示された。OK。

プロジェクトのJavaのビルドパスのライブラリータブからScala Library version 2.7.7.finalを除去。外部JARの追加でandroid-library.jarを追加したいんだが場所わからん。色々調べて

port contents scala

で解決。android-library.jarなんてない...けど、調べてみるとscala-android.jarでいいみたい。自分の場合 /opt/local/share/scala/lib にあった。

4. Add bin folder to the class path に書いてある作業もやった。(GUIからどうやるか分からなかったので直接編集した。

なんか良さそうだからちくちく作ってみる。
とりあえずHelloScala.scalaが動くようになった。

package jp.ne.hatena.vvakame

import _root_.android.app.Activity
import _root_.android.os.Bundle

class HelloScala extends Activity {
  override def onCreate(savedInstanceState: Bundle) = {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.hello_scala)
  }
}

で、現在OnClickListenerでHelloJava.javaに遷移させようとしてるんだけどうまくいかない。
Scalaがそもそも分かってないから何をどうすればScala的にValidなのかわからない...かも。

package jp.ne.hatena.vvakame

import _root_.android.app.Activity
import _root_.android.content.Intent
import _root_.android.os.Bundle

class HelloScala extends Activity {
  override def onCreate(savedInstanceState: Bundle) = {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.hello_scala)

    startActivity(new Intent(this, classOf[HelloJava]))
  }
}

これもちゃんと動いて、Javaで書いたActivityへ遷移できる。

現状の問題点

  1. apkのサイズでかい。HelloScala.apkが700KBくらいある。別の手元のプロジェクトは画像などのリソース込みで27KBとか。proguardというツールで不要classを省いてパッケージできるとかいう記事をどこかでみた気がするので今度調べる。
  2. たまにクラスの名前解決にミスってる気がする。JavaからScalaのクラスをインテリセンスで入力しようとしたとき表示されないことがある。ビルドパスとかの関係だと思う。かも。
  3. Scalaのソースをコンパイルしてくれないタイミングがある気がする。bin以下にclassファイルが吐かれてないときがあるような?
  4. onClickの動かし方が分からない。onClickの中でnew Intent... しようとするとエラーになる。

http://github.com/vvakame/HelloScalaForAndroid

ここまでの状態
http://github.com/vvakame/HelloScalaForAndroid/commit/61c23443a945c2bafc5c74f166410acdb5e57627