提问人:Liu Silong 提问时间:3/8/2018 更新时间:11/18/2023 访问量:4275
Kotlin 和 Unity 开发错误
Kotlin and Unity development error
问:
我使用 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 文件:
答:
如果您的 Android Studio 版本不是 3.0 并且您的 kotlin 是一个插件,您可以再次构建一个项目。这意味着每次更新 kotlin 代码或清理项目时,您都必须构建项目两次。
评论
您不能使用 Kotlin 进行 Unity 开发。
JetBrains 目前没有开发 Kotlin for .NET 的计划。
评论
它与 JetBrain 支持 .NET 无关。我实际上遇到了这个问题,并使用GoogleJarResolver解决了它。
问题
当您将插件打包到 AAR 文件中时,假设使用者(通常是另一个 Android Studio 项目,而不是 Unity)将解析这些依赖项,则依赖项不会打包。但是,正如您所猜到的,Unity 不会在解决 AAR 文件的依赖关系方面做任何事情,因此您必须自己动手。
溶液
谷歌有一个Unity插件,它实际上做到了这一点,它下载了所需的文件以满足依赖关系,并将它们添加到你的项目中。 由于 Google Jar Resolver 主页上的描述和说明超出了您的确切需求,因此我只在此处为您提供针对该特定问题的说明:
- 将 GoogleJarResolver 添加到您的 Unity 项目中。
创建一个名为(其中是插件名称)的文件并将其添加到您的项目中。此文件应包含您的 Gradle 文件依赖项。假设您只使用 Kotlin stdlib,该文件将如下所示: (记得使用正确的 kotlin 版本)
$XDependencies.xml
$X
<dependencies> <androidPackages> <androidPackage spec="org.jetbrains.kotlin:kotlin-stdlibjdk7:1.2.61" /> </androidPackages> </dependencies>
使用 GoogleJarResolver 解决依赖项,方法是在 Unity 中选择菜单项,即 .这将下载所需的依赖项并将其添加到您的项目中。这些将生活在 .
Assets -> Play Services Resolver -> Android Resolver -> Resolve
Assets/Plugins/Android
生成并运行您的应用程序,看看它现在是否正常工作。
我希望它能解决您遇到的问题,就像它解决了我的问题一样!
评论
这是因为在Unity构建的apk中(使用内部构建系统)中没有这样的类。
您应该将 Kotlin 相关的 jar 放入“Assets\Plugins\Android\”文件夹中。
一般来说,你可以从MVNrepository或其他地方下载kotlin-stdlib.jar和kotlin-stdlib-jdk7.jar和kotlin-reflect.jar。(这些将取决于您的 aar 的参考资料)
希望这会有所帮助
您可以尝试使用 Unity 的外部依赖项管理器。
以下是让 Kotlin 库与 Unity 配合使用所需执行的操作:
- 将 Unity Jar Resolver 安装到 Unity 项目中
- 在 Unity 项目的 Assets 文件夹中,创建一些新文件夹。创建一个文件夹 Assets/Plugins/Android/[AndroidLibraryName] 对我来说,那是 Assets/Plugins/Android/MyAndroidLib。将您的 Android 库 AAR 文件复制到此子文件夹。我的库文件名是 MyKotlinLib-debug。
- 在该文件夹中,创建另一个名为 Editor 的子文件夹
- 在该编辑器文件夹中,创建一个以库文件夹名称命名的依赖项文件。对我来说,这个名字是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>
- 在 Unity 项目的 Player Settings -> Player -> Other Settings 中,我必须将“目标 API 级别”设置为 33。
- 完成所有这些操作后,您现在可以使用在上面的 #1 中安装的 Unity Jar Resolver 插件。在 Unity (2022.3.12f1) 中,选择 Assets -> External Dependency Manager -> Android Resolver -> Display Libraries。您应该会看到一个包含内容的对话框。如果对话框为空,则表示配置错误。您可以关闭此对话框,因为我仅使用它来确定解析器插件是否设置正确。
- 现在选择“资产”->“外部依赖项管理器”-“>”Android 解析器“-”>解析”。将出现另一个对话框,您应该看到它正在下载一堆依赖项文件。它们将被复制到您创建的 Android 文件夹中。
此时,我的 Kotlin 库与 Unity 配合使用。感谢这篇文章分享如何让 Java 库与 Unity 配合使用,并感谢 Behnam 向我指出 Unity Jar Resolver 项目。
评论