Android 将Kotlin文件编译为Dex会生成ClassNotFoundException(Kotlin.jvm.internal.Intrinsics)
我正在尝试创建一个在我的Android设备上运行的命令行脚本。我将按照此操作使用Dalvik VM运行已编译的kotlin文件,但在adb shell上运行Android 将Kotlin文件编译为Dex会生成ClassNotFoundException(Kotlin.jvm.internal.Intrinsics),android,kotlin,dalvik,Android,Kotlin,Dalvik,我正在尝试创建一个在我的Android设备上运行的命令行脚本。我将按照此操作使用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
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);
}
我正试图按照编写CLI脚本,但我以前从未将Java字节码编译成Dex,因此我不确定这是否是正确的方法
我应该如何着手修复此错误?我成功地将Kotlin源文件编译成一个可接受的Dex文件。JesusFreke的提示真的很有帮助,也是问题的根源 kotlin编译器已经在默认情况下生成了以JRE6为目标的Java字节码,这是Dalvik需要运行的,因此只需将kotlin运行时包含到Dex文件中即可 以下是我所做的:
$ kotlinc src/edu/ufrn/lapps/Test.kt -include-runtime -d TestKt.jar
$ ~/sdk-patk/build-tools/29.0.1/d8 TestKt.jar --no-desugaring
$ zip TestKt.zip classes.dex
$ adb push TestKt.zip /sdcard/
$ adb shell
$ [on adb shell]: dalvikvm -cp /sdcard/TestKt.zip edu.ufrn.lapps.TestKt
根据文档,使用--no desugaring
删除Java8特性。由于kotlin编译器在默认情况下以JRE6为目标,因此不需要去糖化
一些帮助我的链接:
在这个路径app/build/outputs/apk/debug/myapp.apk中,我认为您的思路是正确的,但是看起来您需要弄清楚如何将kotlin框架包含在dex文件中。我不知道它是如何正常工作的,所以我不能真正帮助解决具体问题。哦,我以为kotlin编译器是为我做的。我会详细调查的。如果是这样的话,我想我会更幸运地使用gradle为我自动化构建过程。
$ kotlinc src/edu/ufrn/lapps/Test.kt -include-runtime -d TestKt.jar
$ ~/sdk-patk/build-tools/29.0.1/d8 TestKt.jar --no-desugaring
$ zip TestKt.zip classes.dex
$ adb push TestKt.zip /sdcard/
$ adb shell
$ [on adb shell]: dalvikvm -cp /sdcard/TestKt.zip edu.ufrn.lapps.TestKt