27

Scala(または他のJava以外のJVM言語)をAndroidプラットフォームに統合することに興味があります。私は、早い段階で行ったScalaを使用したAndroidアプリケーションの作成について言及していませんが、実際には、Androidプラットフォームのソースツリーをビルドするビルドプロセスにフックしています。これは、makefileなどにフックすることの問題になると思います。誰かがこれについて洞察を持っていますか?

私がこれまでに持っているもの: 「[GoogleAndroidをダウンロードしてビルドする] [1]」に基づいて、未使用の形式でビルドされたgit://android.git.kernel.org/platform/manifest.gitのプラットフォームソースツリー

  • build / core / combo / scalac.mk#config.mkに含まれるscalaコンパイラ関連の変数を設定します
  • build / core/definitions.mkにall-subdir-scala-filesとall-scala-files-underの定義を追加しました
  • パッケージに含まれるようにscalaファイルをビルドするためにdefinitions.mkに定義を追加しました

残っているもの:

  • scala-library.jarを含める
  • -bootclasspathへの変更が何も壊れていないことを確認します
  • ScalaクラスがJavaクラスに依存し、その逆の場合の処理​​方法を理解する
  • コードの主要なクリーンアップ
  • テスト!
  • 私が行った変更で(ここに投稿する以外に)何をすべきかを理解する

もうすぐそこにいるようです!!!

過去からのいくつかのメモ

最新:Javaソースファイルがコンパイルされている場所を見つけました!definitions.mkで、「definetransform-java-to-classes.jar」を参照してください。最新のアイデアは、transform-scala-to-classes定義を記述し、それらのクラスをパッケージ化される直接に格納することです。このステップの直前に、transform-java-to-classes.jarでtransform-scala-to-classを呼び出します。eclipseとcygwinのサポートは、回避策でコードが乱雑になり、失敗の可能性が高くなるため、今のところ削除されます。

ビルドプロセスは、build / core /main.mkを実行するルートMakefileによって開始されます。build/core/ main.mkには、HOST_JAVAC、TARGET_JAVAC、およびを設定するbuild / core / combo/javac.mkを含むbuild/core/config.mkが含まれます。 COMMON_JAVAC。COMMON_JAVACは、「共通の引数を持つJavaコンパイラコマンド」です。特別な環境(openjdkまたはeclipse)でない限り、他の2つの変数はデフォルトでこれらの値を取得します。COMMON_JAVACは、このファイルの外部では使用されません。他の2つは、build / core/definitions.mkでのみ使用されます。

build / core / java_library.mk(config.mkに含まれています)は、jarのビルドにのみ関係しているようです。これは私たちが気にする範囲外です。jarとの対話は、scalaファイルの構築にすでに成功していることを前提とするクラスファイルを前提としています。

javaのバージョンに関してmain.mkにチェックがあります。これらを無視し、scalaのバージョンに互換性があると想定します。現在(combo / scalac.mkで)javac.mkで使用されているのと同じ--targetargを使用しています。これはおそらく変数に格納する必要があります。

main.mkには、いくつかの便利な関数を定義するbuild / core/definitions.mkも含まれています。ここで気になるのは、all-java-files-underとall-subdir-java-filesです。後者は、Javaファイルを見つけるためにAndroid.mkファイルで使用されます。前者は後者の実装に使用されます。それらに相当するScalaを書きます。

ビルドプロセスがどのように機能するかを理解するために、私は現在、-nなどを使用してmakeを実行しています。このアイデアは、stackoverflowの記事「[makefileをデバッグするためのツール][2]」から得ました。リメイクによるデバッグも検討中です。

build / core / {config.mk、definitions.mk}は、どのmakeファイル/コマンドが何をするために使用されるかについての光を与えてくれます。

プロジェクトごとのサポートをハッキングする可能性のある方法として、プロジェクトのAndroid.mkファイルに追加のコードが追加される可能性があります。platform / build / core / build-system.htmlから、「Android.mkは、特定のモジュールのビルドを制御するmakefileフラグメントの標準名です。最上位ディレクトリにのみ「Makefile」という名前のファイルが必要です。」と読みます。「scala-build」のような新しいターゲットを作成し、最終的なmakeの前にそれを実行(make PackageName scala-build)することができます。おそらく、変数の割り当てでこっそり隠して、ターゲットを明示的に呼び出す必要性を軽減することもできます。

もう1つの方法(はるかにハック的)は、javacに使用されているコマンドをハイジャックすることです。これはbuild/core / combo/javac.mkで設定されます。プロジェクトのAndroid.mkには、*。javaファイルと一緒に*.scalaファイルをLOCAL_SRC_FILESに含める必要があります。

4

1 に答える 1

7

Reddit のユーザーによると、Ant を使用して Scala を Android に統合するチュートリアルがここにあります

于 2010-08-13T08:46:51.703 に答える