【发布时间】:2019-08-29 21:56:35
【问题描述】:
我正在尝试创建一个命令行脚本以在我的 Android 设备上运行。我正在关注answer 以使用 Dalvik VM 运行已编译的 kotlin 文件,但是当我在 adb shell 上运行 dalvikvm -cp TestKt.zip 时出现以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/jvm/internal/Intrinsics;
at TestKt.main(Unknown Source:2)
Caused by: java.lang.ClassNotFoundException: Didn't find class
"kotlin.jvm.internal.Intrinsics" on path: DexPathList[[zip file "TestKt.zip"],
nativeLibraryDirectories=[/system/lib64, /system/vendor/lib64,
/system/lib64, /system/vendor/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
... 1 more
这是我正在尝试编译的简单文件 (Test.kt):
package edu.ufrn.lapps
fun main(args: Array<String>) {
println(args.size);
}
我写了一个 Makefile 来编译它(主要是因为这只是一个测试,但是一旦我需要依赖项,我可能会转移到 Gradle):
NAME := TestKt
OUTPUT := TestKt
PKG := edu/ufrn/lapps
KFLAGS := -include-runtime
D8C := $(HOME)/Android/Sdk/build-tools/29.0.1/d8
D8FLAGS := --no-desugaring
dex:
kotlinc src/$(PKG)/Test.kt
$(D8C) $(D8FLAGS) $(PKG)/$(OUTPUT).class
zip: dex
zip $(OUTPUT).zip classes.dex
jvm:
kotlinc $(SRC)/Test.kt $(KFLAGS) -d $(OUTPUT).jar
.PHONY: clean
clean:
-rm -r META-INF/
-rm $(OUTPUT).jar $(OUTPUT).zip
我正在尝试按照AOSP cmds 制作我的 CLI 脚本,但我之前从未将 Java 字节码编译为 Dex,所以我不确定这是否是正确的方法。
我应该如何解决这个错误?
【问题讨论】:
-
我认为你在正确的轨道上,但看起来你需要弄清楚如何在 dex 文件中包含 kotlin 框架。我不知道它是如何正常工作的,所以我无法提供具体的帮助。
-
哦,我以为 kotlin 编译器是为我做的。我会更深入地研究它。如果是这样的话,我想我会更幸运地使用 gradle 为我自动化构建过程。