【发布时间】:2016-03-17 12:42:59
【问题描述】:
我对 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 并没有帮助。这是我尝试过的:
- 执行
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 重新运行
grade build,希望Kotlin 现在可以找到.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 编译器可以找到它们。第二个后续问题是如何实现自动化,以便单个 gradle build 命令首先运行 Krakatau 汇编器,然后再运行 Kotlin 编译器。
作为参考,这里是我的源文件:
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())
}
}
【问题讨论】:
标签: java gradle android-gradle-plugin kotlin jasmin