Android アプリ用に次の設定をしています。
├── build.gradle
└── src
└── main
├── AndroidManifest.xml
├── asm
│ └── SomeJVMClass.j
├── kotlin
│ └── activity.kt
└── res
└── values
└── strings.xml
のソースファイルsrc/main/asm/SomeJVMClass.j
はKrakatau形式の JVM アセンブリです (Jasmin とほぼ同じです)。メインの Kotlin ソースから定義されたクラスを使用したいと思いますactivity.kt
。
Gradle でこれを自動化しようとする前に、ファイルを手動でアセンブルするだけでbuild
は役に立ちません。これが私が試したことです:
- a
gradle build
を実行してスケルトンbuild
ディレクトリを取得します (もちろん、これは Kotlin コンパイラが見つからないため失敗しますSomeJVMClass
) 。 Krakatau を手動で実行して、そのクラス ファイルを 次の場所に配置します
build/intermediates/classes/{debug,release}
。$ for flavor in debug release; do ~/prog/jvm/krakatau/assemble.py -out build/intermediates/classes/$flavor -r src/main/asm ;done Processing file src/main/asm/SomeJVMClass.j, 1/1 remaining Class written to build/intermediates/classes/debug/com/example/JVMServer/SomeJVMClass.class Processing file src/main/asm/SomeJVMClass.j, 1/1 remaining Class written to build/intermediates/classes/release/com/example/JVMServer/SomeJVMClass.class
Kotlin がファイル
grade build
を見つけることを期待して再実行します。.class
しかし、まったく改善されません:
:compileDebugKotlin e: /home/cactus/prog/android/kotlin-asm/src/main/kotlin/activity.kt (3,20): Unresolved reference: JVMServer e: /home/cactus/prog/android/kotlin-asm/src/main/kotlin/activity.kt: (12,14): Unresolved reference: SomeJVMClass
したがって、最初の質問は、明らかに、.class
Kotlin コンパイラがそれらを見つけられるように、結果のファイルをどこに置くかということです。そして 2 番目のフォローアップの質問はgradle build
、Kotlin コンパイラーを実行する前に、単一のコマンドが最初に Krakatau アセンブラーを実行するように自動化するにはどうすればよいかということです。
参考までに、私のソースファイルは次のとおりです。
src/main/asm/SomeJVMClass.j
:
.class public com/example/JVMServer/SomeJVMClass
.super java/lang/Object
.method public static foo: ()Ljava/lang/String;
.code stack 2 locals 0
ldc "JVM bytecode works"
areturn
.end code
.end method
.end class
src/main/kotlin/activity.kt
:
package com.example.JVMClient
import com.example.JVMServer.SomeJVMClass
import android.app.Activity
import android.os.Bundle
class MainActivity: Activity() {
protected override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setTitle(SomeJVMClass.foo())
}
}