我使用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文件:
答案 0 :(得分:5)
与支持.NET的 JetBrain无关。。我实际上遇到了这个问题,并通过使用GoogleJarResolver解决了这个问题。
当您将插件打包到AAR文件中时,假设使用者(通常是另一个Android Studio项目而不是Unity)将解决这些依赖关系,则依赖关系将不随其一起打包。但是,您可能会猜到,Unity在解决AAR文件的依赖性方面没有做任何事情,因此您必须自己做。
Google有一个真正的Unity插件,它会下载所需的文件来满足依赖关系,并将它们添加到您的项目中。 由于Google Jar Resolver主页上的描述和说明超出了您真正需要的范围,因此,我仅在此为您提供针对特定问题的说明:
创建一个名为$XDependencies.xml
(其中$X
是您的插件的名称)的文件并将其添加到您的项目中。该文件应包含您的Gradle文件依赖性。假设您仅使用Kotlin stdlib,文件将如下所示:(请记住使用正确的Kotlin版本)
<dependencies>
<androidPackages>
<androidPackage spec="org.jetbrains.kotlin:kotlin-stdlibjdk7:1.2.61" />
</androidPackages>
</dependencies>
通过选择Unity中的菜单项Assets -> Play Services Resolver -> Android Resolver -> Resolve
,使用GoogleJarResolver解决依赖关系。这将下载所需的依赖项并将其添加到您的项目中。这些将位于Assets/Plugins/Android
下。
构建并运行您的应用程序,然后查看它是否可以正常工作。
我希望它能像解决我的问题一样解决您遇到的问题!
答案 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。