Связывание с JMM классами, определенными asm из Kotlin с использованием Gradle

У меня есть следующая настройка для приложения для Android:

├── build.gradle └── src └── main ├── AndroidManifest.xml ├── asm │  └── SomeJVMClass.j ├── kotlin │  └── activity.kt └── res └── values └── strings.xml 

Исходный файл в src/main/asm/SomeJVMClass.j – это сборка JVM формата Krakatau (это почти то же самое, что и Jasmin). Я хотел бы использовать класс, который он определяет, из моего основного источника Kotlin activity.kt .

Прежде чем я даже попытаюсь автоматизировать это с помощью Gradle, просто сборка файла вручную в build не поможет. Вот что я пробовал:

  1. gradle build чтобы получить gradle build скелета (это, конечно, не с компилятором Kotlin, не находящим SomeJVMClass )
  2. Я запускаю 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 
  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 мог их найти. И второй, последующий вопрос: каким образом я могу автоматизировать это, чтобы одна 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()) } } 

Изменить: получается, что этот подход не работает для android-gradle

Это больше связано с градиентом, чем с Kotlin, вы можете сказать, что gradle включает .class во время компиляции, добавляя файлы компиляции оператора compile files("build/intermediates/classes/debug") к вашим зависимостям.

Это поместит файлы .class в путь к классам, где Kotlin должен будет их найти.

Intereting Posts
Кинжал пропускает генерацию Factory для модуля Google Services при использовании kapt Функция, показывающая таинственное поведение JSON для HashMap с объектами с использованием Gson Модификаторы видимости kotlin не совпадают Определить возвращаемый тип Retrofit с использованием интерфейса вместо класса Преобразовать ByteArrayOutputStream в json в Котлин Kotlin: Неразрешенная ссылка: javaClass Наблюдение за повторным использованием выполнения оператора Как вернуть результат в doInBackground после завершения процесса завершения работы в API UserLoginTask BadCredentialsException: не удалось получить токен доступа с безопасностью загрузки Oauth2 на GAE Android DataBinding: @BindingAdapter в Kotlin не распознает lambdas Kotlin: Как преобразовать список в список со списком? Обратный экземпляр enum непосредственно без класса в Котлине Могу ли я расширить на Java класс делегирования Kotlin? Как оживить ConstraintLayout снизу вверх экрана?