3

Android アプリ用に次の設定をしています。

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

のソースファイルsrc/main/asm/SomeJVMClass.jKrakatau形式の JVM アセンブリです (Jasmin とほぼ同じです)。メインの Kotlin ソースから定義されたクラスを使用したいと思いますactivity.kt

Gradle でこれを自動化しようとする前に、ファイルを手動でアセンブルするだけでbuildは役に立ちません。これが私が試したことです:

  1. agradle buildを実行してスケルトン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. Kotlin がファイルgrade buildを見つけることを期待して再実行します。.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

したがって、最初の質問は、明らかに、.classKotlin コンパイラがそれらを見つけられるように、結果のファイルをどこに置くかということです。そして 2 番目のフォローアップの質問はgradle build、Kotlin コンパイラーを実行する前に、単一のコマンドが最初に 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())
  }
}
4

1 に答える 1