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を使っちゃってる。動いてるんだからまぁいいのかなぁ?