刺身の上にたんぽぽ乗せる日記

プログラミングしたり、自販機の下に落ちてる小銭を集めたりしてます

AndroidでScalaを使う

というか、使えない。

酷く時間がかかったけど、ようやくできた。ネットを調べてると、色々なアプローチが書いてあるんだけど、antの使い方わからないし、おぼえるの面倒だからeclipseだけでできる方法で頑張ってみたんだが、うまくいかん。

とりあえず、http://www.venturenow.jp/column/oohata/20110421011372.html に書かれている通りにセットアップする

  • scalaのインストールはmacだからbrew install scalaで終わり。
  • /usr/local/bin/sbaz install scala-androidすると、データは/usr/local/Cellar/scala/2.9.0/libexec/に入った
  • Add scala natureが見つからなくて困ったけど、eclipseのPackage explorerじゃなくてProject explorer見てた。未だに違いがわからないので滅べばいいと思います。
  • ボタン追加とかしたりして、リソースを変更すると、scalaのほうから中々認識してくれないので、一旦cleanして、再buildとかしないとだめ。

で、一応動くんだが、無名関数が全然動かない。

val a = () => {};

この一行で無名関数のクラスがjava.lang.NoClassDefFoundErrorで死ぬ。最初はdexのほうにクラスが入ってないのかと思って、dumpしてみたら普通に入ってた。さらにダメ元でexternal class folderにbin/を追加してみたら、普通に二度追加されててビルドが通らない。

無名クラスは大丈夫なようで、


this.findViewById(R.id.button).setOnClickListener(new View.OnClickListener {
def onClick(v:View) = {
val msg:String = "clicked" + count;
findViewById(R.id.text).asInstanceOf[TextView].setText(msg);
count+=1;
};
});

これは通るけど、"clicked" + count;のところでscala.collection.mutable.StringBuilderのjava.lang.NoClassDefFoundErrorで死ぬ。何故そんないかにもプリミティブなブツがないのかわからん。

無名関数は最悪使えなくてもJava以上に不便にはならないからいいとして、流石に文字列の連結ができないのは不便すぎる。ScalaAndroidアプリ書いている人がいるから、できるには違いないと思うんだけど、もうこれ以上頑張るのは面倒臭いので、来年辺りにちゃんと色々整備されてちゃんと使えるようになったら再考してみようと思う。うんこ。