Kotlin和Unity开发错误

Liu*_*ong 1 android unity-game-engine kotlin

我使用Android Studio和Unity开发,将Library打包成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
Run Code Online (Sandbox Code Playgroud)

活动

class PluginActivity : UnityPlayerActivity() {
fun showToast(msg: String) {
    runOnUiThread {
        Toast.makeText(this@PluginActivity.applicationContext, msg, Toast.LENGTH_SHORT).show()
    }
}
Run Code Online (Sandbox Code Playgroud)

}

.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);
}
Run Code Online (Sandbox Code Playgroud)

aar文件:

在此输入图像描述

小智 6

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

问题

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

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

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

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

  3. 通过选择Unity中的菜单项,使用GoogleJarResolver解析依赖关系Assets -> Play Services Resolver -> Android Resolver -> Resolve.这将下载并向项目添加所需的依赖项.这些将生活在Assets/Plugins/Android.

  4. 构建并运行您的应用程序,看它现在是否有效.

我希望它可以解决你所拥有的问题,就像它固定我的一样!