ScalaでAndroid用jar

ScalaでのAndroid開発用にヘルパライブラリを徐々に育てていこうかなと思ったが、Java素人の自分ははじめの一歩で大苦戦。とりあえず目的は達したので備忘録。

jarをつくる

とりあえずこんなファイルを作って

package jp.papamitra.scalaandroid

object AndroidHelper{
  import android.view.View
  import android.view.View.OnClickListener
  implicit def funcToClicker(f:View => Unit):OnClickListener = 
    new OnClickListener(){ def onClick(v:View)=f.apply(v)}
  implicit def funcToClicker0(f:() => Unit):OnClickListener = 
    new OnClickListener() { def onClick(v:View)=f.apply}
}

同じディレクトリにandroid.jarとscala-android.jarをおいてコンパイル

$ scalac -cp .:scala-android.jar:android.jar AndroidHelper.scala 

jarに固める。

$ jar cvfM androidhelper.jar jp/

あとはできたandroidhelper.jarをAndroidプロジェクトのlibsディレクトリに放り込めばOK。
ライブラリがでかくなってくると明らかに破綻しそうだけど、それはその時考えることにする。

buildでこける

放り込めばOKとかいっておいて実際はdex作る段階でこけた。

dex:
     [echo] Converting compiled files and external libraries into bin/classes.dex...
    [apply] 
    [apply] UNEXPECTED TOP-LEVEL EXCEPTION:
    [apply] java.lang.IllegalArgumentException: already added: Ljp/papamitra/scalaandroid/AndroidHelper$;

どうもandroidhelper.jarを2回dexファイルに入れようとしたらしい。
android_rules.xmlを見てみるとproguard.out.jarにすでにandroidhelper.jarが入っているのに、さらにdex作るときにもlibsからjarを取り込もうとしていた。(android_rules.xmlについては前々回参照)

android_rules.xmlからlibsにあるjarの取り込み部分をコメントアウト

--- android_rules.xml.orig  2010-04-11 20:08:47.000000000 +0900
+++ android_rules.xml 2010-04-11 20:07:15.000000000 +0900
@@ -176,7 +176,7 @@
      <fileset file="${scala-android.jar}"/>
      -->
      <fileset file="${proguard.out.jar}" />
-     <fileset dir="${external-libs-folder}" includes="*.jar" />
+<!--     <fileset dir="${external-libs-folder}" includes="*.jar" />-->
    </apply>
  </target>

無事buildされた。

余談だけどbuildログを改めてみてみるとscala-android.jar使ってないね…。scala-library.jarを使っちゃってる。動いてるんだからまぁいいのかなぁ?