Kotlin 和 Unity 开发错误

Kotlin and Unity development error

提问人:Liu Silong 提问时间:3/8/2018 更新时间:11/18/2023 访问量:4275

问:

我使用 Android Studio 和 Unity 开发,将库打包成 aar 文件,然后将 aar 文件作为 Unity 插件。当我使用 Java 时,没问题,但是使用 Kotlin 时,它会抛出异常。谢谢!

例外:

 AndroidJavaException: java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/jvm/internal/Intrinsics;
                                    java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/jvm/internal/Intrinsics;
                                        at com.lsl.plugin.PluginActivity.showToast(PluginActivity.kt)
                                        at com.unity3d.player.UnityPlayer.nativeRender(Native Method)
                                        at com.unity3d.player.UnityPlayer.c(Unknown Source)
                                        at com.unity3d.player.UnityPlayer$c$1.handleMessage(Unknown Source)
                                        at android.os.Handler.dispatchMessage(Handler.java)
                                        at android.os.Looper.loop(Looper.java)
                                        at com.unity3d.player.UnityPlayer$c.run(Unknown Source)
                                     Caused by: java.lang.ClassNotFoundException: Didn't find class "kotlin.jvm.internal.Intrinsics" on path: DexPathList[[zip file "/data/app/com.lsl.aardemo-1/base.apk"],nativeLibraryDirectories=[/data/app/com.lsl.aardemo-1/lib/arm, /data/app/com.lsl.aardemo-1/base.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]]
                                        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
                                        at java.lang.ClassLoader.loadClass(ClassL

活动

class PluginActivity : UnityPlayerActivity() {
fun showToast(msg: String) {
    runOnUiThread {
        Toast.makeText([email protected], msg, Toast.LENGTH_SHORT).show()
    }
}

}

.cs 脚本

    public static AndroidTools GetInstance(){
    if (instance == null) {
        lock (syncRoot) {
            if (instance == null) {
                jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
                jo = jc.GetStatic<AndroidJavaObject> ("currentActivity");
                instance = new AndroidTools ();
            }
        }
    }
    return instance;
}

public void ShowToast(string message){
    jo.Call ("showToast",message);
}

AAR 文件:

enter image description here

Android unity-游戏引擎 kotlin

评论

0赞 Zoe is on strike 3/8/2018
Gradle 项目的可能重复项:java.lang.NoClassDefFoundError:kotlin/jvm/internal/Intrinsics
0赞 Liu Silong 3/8/2018
谢谢,我明白如何使用“影子插件”了!imperceptiblethoughts.com/shadow

答:

0赞 TangXianQiang 3/8/2018 #1

如果您的 Android Studio 版本不是 3.0 并且您的 kotlin 是一个插件,您可以再次构建一个项目。这意味着每次更新 kotlin 代码或清理项目时,您都必须构建项目两次。

评论

0赞 Liu Silong 3/8/2018
我的Android Studio版本是3.0.1
-2赞 Gabor 8/2/2018 #2

您不能使用 Kotlin 进行 Unity 开发。

JetBrains 目前没有开发 Kotlin for .NET 的计划。

评论

0赞 Liu Silong 8/2/2018
谢谢你的回答。
9赞 Behnam Sattar 10/10/2018 #3

它与 JetBrain 支持 .NET 无关。我实际上遇到了这个问题,并使用GoogleJarResolver解决了它。

问题

当您将插件打包到 AAR 文件中时,假设使用者(通常是另一个 Android Studio 项目,而不是 Unity)将解析这些依赖项,则依赖项不会打包。但是,正如您所猜到的,Unity 不会在解决 AAR 文件的依赖关系方面做任何事情,因此您必须自己动手。

溶液

谷歌有一个Unity插件,它实际上做到了这一点,它下载了所需的文件以满足依赖关系,并将它们添加到你的项目中。 由于 Google Jar Resolver 主页上的描述和说明超出了您的确切需求,因此我只在此处为您提供针对该特定问题的说明:

  1. GoogleJarResolver 添加到您的 Unity 项目中。
  2. 创建一个名为(其中是插件名称)的文件并将其添加到您的项目中。此文件应包含您的 Gradle 文件依赖项。假设您只使用 Kotlin stdlib,该文件将如下所示: (记得使用正确的 kotlin 版本)$XDependencies.xml$X

    <dependencies> <androidPackages> <androidPackage spec="org.jetbrains.kotlin:kotlin-stdlibjdk7:1.2.61" /> </androidPackages> </dependencies>

  3. 使用 GoogleJarResolver 解决依赖项,方法是在 Unity 中选择菜单项,即 .这将下载所需的依赖项并将其添加到您的项目中。这些将生活在 .Assets -> Play Services Resolver -> Android Resolver -> ResolveAssets/Plugins/Android

  4. 生成并运行您的应用程序,看看它现在是否正常工作。

我希望它能解决您遇到的问题,就像它解决了我的问题一样!

评论

0赞 Mahdi-Malv 1/30/2019
这个解决方案似乎是正确的,但对我不起作用。对此有任何更新吗?
0赞 Behnam Sattar 2/12/2019
您@Malv可以指定哪些内容不起作用?您是否能够使用 GoogleJarResolver 添加依赖项?您仍然遇到与问题中提到的异常相同的异常吗?
0赞 Mahdi-Malv 2/12/2019
不知道怎么回事。但是这个问题已经解决了一段时间。
0赞 kralvarado 1/29/2020
@BehnamSattar 我是 Unity 开发的新手,但我需要创建一个 AAR 来覆盖 Android 应用程序的默认 Activity。尝试使用 mUnityPlayer.onTouchEvent() 处理 MotionEvents 并放入 Unity。其中一些项目是在 Kotlin 中开发的。使用 AAR 作为插件的应用程序给出了相同的 java.lang.NoClassDefFoundError,指的是 Lkotlin,我对将 GoogleJarResolver 添加到进程中感到困惑。它是在我构建 AAR 文件后添加到 Unity 中,还是将其包含在我制作 AAR 的 AndroidStudio 项目中?
0赞 Behnam Sattar 2/9/2020
@kralvarado 我上面提到的过程与创建 AAR 文件并将其添加到项目中是完全分开的。GoogleJarResolver 的作用是获取和添加您想要的依赖项。你告诉它你需要什么依赖项(通过创建该$XDependencies.xml文件),然后在 Unity 中运行它。在它获取所需的依赖项之后。因此,请确保您知道您的插件依赖于哪些包。就我而言,它只是 Kotlin 标准库。您需要根据插件依赖项创建 xml 文件。
3赞 Ken Wu 3/24/2020 #4

这是因为在Unity构建的apk中(使用内部构建系统)中没有这样的类。

您应该将 Kotlin 相关的 jar 放入“Assets\Plugins\Android\”文件夹中。

一般来说,你可以从MVNrepository或其他地方下载kotlin-stdlib.jarkotlin-stdlib-jdk7.jarkotlin-reflect.jar。(这些将取决于您的 aar 的参考资料)

希望这会有所帮助

0赞 DeMartery 1/12/2022 #5

您可以尝试使用 Unity 的外部依赖项管理器

0赞 szaske 11/18/2023 #6

以下是让 Kotlin 库与 Unity 配合使用所需执行的操作:

  1. 将 Unity Jar Resolver 安装到 Unity 项目中
  2. 在 Unity 项目的 Assets 文件夹中,创建一些新文件夹。创建一个文件夹 Assets/Plugins/Android/[AndroidLibraryName] 对我来说,那是 Assets/Plugins/Android/MyAndroidLib。将您的 Android 库 AAR 文件复制到此子文件夹。我的库文件名是 MyKotlinLib-debug。
  3. 在该文件夹中,创建另一个名为 Editor 的子文件夹
  4. 在该编辑器文件夹中,创建一个以库文件夹名称命名的依赖项文件。对我来说,这个名字是MyKotlinLibDependencies.xml。以下是该文件中的内容:
<dependencies>
  <androidPackages>
    <repositories>
      <repository>https://repo.maven.apache.org/maven2</repository>
    </repositories>
    <androidPackage spec="androidx.core:core-ktx:1.9.0">
      <androidSdkPackageIds>
        <androidSdkPackageId>extra-google-m2repository</androidSdkPackageId>
      </androidSdkPackageIds>
      <repositories>
        <repository>https://maven.google.com</repository>
      </repositories>
    </androidPackage>
  </androidPackages>
</dependencies>
  1. 在 Unity 项目的 Player Settings -> Player -> Other Settings 中,我必须将“目标 API 级别”设置为 33。
  2. 完成所有这些操作后,您现在可以使用在上面的 #1 中安装的 Unity Jar Resolver 插件。在 Unity (2022.3.12f1) 中,选择 Assets -> External Dependency Manager -> Android Resolver -> Display Libraries。您应该会看到一个包含内容的对话框。如果对话框为空,则表示配置错误。您可以关闭此对话框,因为我仅使用它来确定解析器插件是否设置正确。
  3. 现在选择“资产”->“外部依赖项管理器”-“>”Android 解析器“-”>解析”。将出现另一个对话框,您应该看到它正在下载一堆依赖项文件。它们将被复制到您创建的 Android 文件夹中。

此时,我的 Kotlin 库与 Unity 配合使用。感谢这篇文章分享如何让 Java 库与 Unity 配合使用,并感谢 Behnam 向我指出 Unity Jar Resolver 项目。