使用 Gradle 从 Kotlin 链接到 JVM asm 定义的类



我有一个安卓应用程序的以下设置:

├── 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 并没有帮助。这是我尝试过的:

  1. 执行gradle build以获取框架build目录(这当然会失败,Kotlin 编译器找不到SomeJVMClass
  2. 我手动运行喀拉喀托以将其类文件放入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
    
  3. 重新运行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 编译器可以找到它们。第二个后续问题是,我如何自动化,以便在运行 Kotlin 编译器之前,单个gradle build命令将首先运行 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())
  }
}

编辑:事实证明这种方法不适用于 android-gradle

这与 gradle 比 Kotlin 更相关,您可以通过将语句compile files("build/intermediates/classes/debug")添加到依赖项中来告诉 gradle 在编译期间包含.class文件。

这会将.class文件放在 Kotlin 应该能够找到它们的类路径上。

相关内容

  • 没有找到相关文章

最新更新