I have the following setup for an Android app:
├── build.gradle
└── src
└── main
├── AndroidManifest.xml
├── asm
│ └── SomeJVMClass.j
├── kotlin
│ └── activity.kt
└── res
└── values
└── strings.xml
The source file in src/main/asm/SomeJVMClass.j is Krakatau format JVM assembly (it's almost the same as Jasmin). I would like to use the class it defines from my main Kotlin source activity.kt.
Before I even get to trying to automate this with Gradle, just assembling the file manually into build doesn't help. Here's what I tried:
- Do a
gradle buildto get the skeletonbuilddirectory (this of course fails with the Kotlin compiler not findingSomeJVMClass) I run Krakatau manually to put its class files in
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.classRe-run
grade buildwith the hope that Kotlin will now find the.classfiles; but no improvement whatsoever:
: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
So the first question is, obviously, where do I put the resulting .class files so that the Kotlin compiler can find them. And the second, follow-up question, is how do I automate that so that a single gradle build command will run the Krakatau assembler first, before running the Kotlin compiler.
For reference, here are my source files:
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())
}
}