Unity3d Unity错误:无法将类转换为dex格式

Unity3d Unity错误:无法将类转换为dex格式,unity3d,jar,android-unity-plugin,Unity3d,Jar,Android Unity Plugin,我已经创建了一个Android Unity插件(.aar文件),它为我的Unity游戏提供了一些自定义定位数据。在我的统一脚本中,我使用 var x=customClass.CallStatic(“getHeadX”) 以获取一些位置数据。此方法每帧调用一次以获取更新的数据(轮询方法),这使其效率低下。相反,我决定在更新的数据准备就绪后,从java代码(插件端)调用Unity脚本中的C#方法。为此,我在java插件中写道 import com.unity3d.player.UnityPlayer

我已经创建了一个Android Unity插件(.aar文件),它为我的Unity游戏提供了一些自定义定位数据。在我的统一脚本中,我使用

var x=customClass.CallStatic(“getHeadX”)

以获取一些位置数据。此方法每帧调用一次以获取更新的数据(轮询方法),这使其效率低下。相反,我决定在更新的数据准备就绪后,从java代码(插件端)调用Unity脚本中的C#方法。为此,我在java插件中写道

import com.unity3d.player.UnityPlayer;
...
UnityPlayer.UnitySendMessage("Manager", // gameObject name
                             "PluginCallback", // this is a callback in C# 
                             "Hello from android plugin"); // msg which is not needed actually
但是,编译器抱怨包com.unity3d.player.UnityPlayer不存在。所以我从中复制了classes.jar文件

C:\程序文件 (x86)\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes \classes.jar

进入我的android插件项目的“libs”文件夹。我成功地构建了它,并将生成的.aar文件(mylibrary release.aar)复制到Unity项目的Assets\Plugins\Android文件夹中

当我构建Unity项目(使用“内部”构建系统)时,会出现以下错误:

IOException:无法从中移动文件/目录 “Temp/stagingara\android libraries\mylibrary release\classes.jar”到 “Temp/stagingara\android libraries\mylibrary release\libs\classes.jar”。 UnityEditor.Android.PostProcessor.Tasks.ProcessAAR.Execute

发生此错误的原因是classes.jar依赖项与classes.jar(由unity在我的插件中创建)存在名称冲突。因此,我将依赖项名称更改为unity\u classes.jar,这解决了问题,但现在我在构建unity应用程序时遇到了一个新错误:

CommandInvokationFailure:无法将类转换为dex格式。 C:/ProgramFiles/Java/jdk1.8.0_102\bin\Java.exe-Xmx2048M Dcom.android.sdkmanager.toolsdir=“C:/Users/kamran.shamloo/AppData/Local/android/Sdk\tools” -Dfile.encoding=UTF8-jar“C:\ProgramFiles(x86)\Unity\Editor\Data\PlaybackEngines\AndroidPlayer/Tools\sdktools.jar”

stderr[未捕获的翻译错误: java.lang.IllegalArgumentException:已添加: Lbitter/jnibridge/jnibridge;未捕获的翻译错误: java.lang.IllegalArgumentException:已添加: Lbitter/jnibridge/jnibridge$a;未捕获的翻译错误: java.lang.IllegalArgumentException:已添加: Lcom/unity3d/player/NativeLoader;未捕获的翻译错误: java.lang.IllegalArgumentException:已添加: Lcom/unity3d/player/ReflectionHelper;未捕获的翻译错误: java.lang.IllegalArgumentException:已添加: Lcom/unity3d/player/ReflectionHelper$1;未捕获的翻译错误: java.lang.IllegalArgumentException:已添加: Lcom/unity3d/player/ReflectionHelper$a;未捕获的翻译错误: java.lang.IllegalArgumentException:已添加: Lcom/unity3d/player/UnityPlayer;未捕获的翻译错误: java.lang.IllegalArgumentException:已添加: Lcom/unity3d/player/UnityPlayer$1;未捕获的翻译错误: java.lang.IllegalArgumentException:已添加: Lcom/unity3d/player/UnityPlayer$10;

classes.jar(您后来将其重命名为“unity_classes.jar”)由unity自动包含在build.apk中,因此您不应该再将其包含在自己的Android插件中,即使使用不同的名称

换句话说,首先你的android插件将这个.jar文件“嵌入”到自己的内部。然后,当Unity将你的插件添加到游戏项目中时,它也会添加自己的.jar文件副本(它对所有android项目都这样做)因此,Unity实际上在项目中拥有相同.jar文件的两个副本,并抱怨说“无法将类转换为dex格式”

因此,尽管您必须在项目中使用此库(.jar文件),但不应将此库与项目捆绑在一起。如何做到这一点?如果您使用的是Android studio,可以通过将.jar文件标记为依赖项来实现

为此,您可以:

1) 转到模块的“build.gradle”并更改此选项:

compile files('libs/jars/unity_classes.jar')
为此:

provided files('libs/jars/unity_classes.jar')

2) 您可以右键单击模块(在Android窗格中)并选择打开模块设置。然后转到依赖项选项卡。找到Unity模块(我将其重命名为Unity_classes.jar),并将其范围更改为提供的