使用Gradle从Kotlin链接到JVM的asm定义的类
我有一个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
-
希望Kotlin现在可以找到
.class
文件,重新运行grade build
; 但没有任何改善:
: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应该能够找到它们的类路径上。
- 项目结构上的Android Studio中的StackOverflowError:null
- 'com.android.tools.build:gradle:3.0.0-alpha3'和'com.android.tools.build:gradle:3.0.0-alpha1'有什么区别?
- Android设备版本的React-Native项目没有更新,即使模拟器是
- 创建XML文件时出现卡顿exception
- Android数据绑定构建失败后,Gradle插件更新迁移到annotationProcessor
- Android Studio 2.2无法找到所有kotlin文件的引用
- Android Studio 3.0.1错误:Gradle项目同步失败。 基本function(如编辑,调试)将无法正常工作
- 是否有可能使用Java 8进行Android开发?
- 如何添加RecyclerView依赖 – gradle 3