Kotlin和Unity开发错误

时间:2018-03-08 02:02:40

标签: android unity3d 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

活性

class PluginActivity : UnityPlayerActivity() {
fun showToast(msg: String) {
    runOnUiThread {
        Toast.makeText(this@PluginActivity.applicationContext, 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

4 个答案:

答案 0 :(得分:5)

与支持.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中的菜单项Assets -> Play Services Resolver -> Android Resolver -> Resolve,使用GoogleJarResolver解决依赖关系。这将下载所需的依赖项并将其添加到您的项目中。这些将位于Assets/Plugins/Android下。

  4. 构建并运行您的应用程序,然后查看它是否可以正常工作。

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

答案 1 :(得分:2)

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

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

通常,您可以下载 kotlin-stdlib.jar kotlin-stdlib-jdk7.jar kotlin-reflect.jar 表单MVNrepository或某处。 (这取决于您的aar的推荐人)

希望这会有所帮助

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

  

JetBrains目前没有计划在.NET上使用Kotlin。