Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将Kotlin文件编译为Dex会生成ClassNotFoundException(Kotlin.jvm.internal.Intrinsics)_Android_Kotlin_Dalvik - Fatal编程技术网

Android 将Kotlin文件编译为Dex会生成ClassNotFoundException(Kotlin.jvm.internal.Intrinsics)

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

我正在尝试创建一个在我的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 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为目标,因此不需要去糖化

一些帮助我的链接:


从outputs文件夹中删除调试Apk文件解决了它
在这个路径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