読者です 読者をやめる 読者になる 読者になる

夢とガラクタの集積場

落ちこぼれ三流エンジニアである管理人の夢想=『夢』と、潰えた夢=『ガラクタ』の集積場です。

Scala2.9 Android Eclipseプラグイン導入失敗記(その1

こんばんは。

とりあえず以前の投稿の続きとして、
Scala2.9をAndroid Eclipseプラグインに導入して、Scala2.9のコードをそのままAndroidに放りこめないかな?
というのを試してみました。

・・・タイトルから失敗したのはわかるとは思いますが、お付き合いください^^;

とまぁ、ただまずその前提として。

1.そもそも、なんでScalaAndroidで動くんだっけ?

Androidは下記の図のようにJavaバイトコード(.class)を
Android DalvikVMで動作するAndroidバイトコード(.dex)に変換して動作させています。
#なので、Dalvik VMJVMではありません。

で、ScalaをはじめとしたJVM言語はコンパイルによってJavaバイトコード(.class)を生成します。

そのため、JVM言語で作ったコードもAndroidで動くはず。。。というわけです。
こういった前提があるので、基本的には動作するはずなんですよね。


2.どんな環境で実行しよう?

とりあえず、今回の確認は下記の環境で試しています。

  • jdk1.6.0_27(jdk7はJavaプログラミングでは愛用してますが、今回はお預け)
  • scala-2.9.1-final
  • Apache Ant version 1.8.2
  • Eclipse3.7
  • Android2.3.4(API Ver10)
  • ADT12.0

3.Scala2.9用Scala-Androidライブラリをビルド

まずはScalaのダウンロードページからScalaのソースをダウンロードします。
Scalaのライブラリの中にAndroid用のライブラリも含まれていて、
それを用いてビルドを行うことでAndroid用のライブラリになる。。。そうです。

下記ページの「Sources (SVN repository snapshot)」からソースをダウンロードします。

解凍するとsrcディレクトリ配下に「android-library」と、「library」というディレクトリがあるはずです。

この「android-library」ディレクトリ配下にはAndroid向けにScalaライブラリ(library)を一部改編したソースが含まれています。
尚、差分があったファイル・・・というか、「android-library」ディレクトリ配下に存在していたファイルは下記の2ファイルでした。

どうせならということで、上記2ファイルの差分比較も行いました。

ScalaObject.scalaの差分

もともとのScalaライブラリではjava.lang.Objectのextends、Android版ではAnyRefのextendsとなっています。
JavaScalaのブリッジの扱いがDexコード上では異なるのかもしれません。

ScalaBeanInfo.scalaの差分

こちらはずいぶんあからさまですが、そもそもAndroid側では実装コードがありません。
リフレクションでクラスの情報などを取得する処理の一部がDexコード上ではそもそも出来ないのかもしれませんね。
Class.forNameでClassインスタンス生成くらいだったらDexコードでも普通にできるんですが。

とまぁ、では「library」ディレクトリに「android-library」ディレクトリの中身を上書きしてビルド開始です。

Antでビルド

特に難しいこともなく、ソースをダウンロードして出来たディレクトリ配下で「and build」コマンドをうつだけです。

ビルド終了までしばらく待ちましょう。結構時間かかります。

ビルドが完了すれば「lib」ディレクトリ配下にScalaのライブラリJarファイルが生成されます。

とりあえず、これでAndroid用Scala2.9用ライブラリのコンパイルは完了。
後はこれを実際に適用できるかですね。

続きは次回〜