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

时间:2017-06-10 00:44:49

标签: unity3d jar android-unity-plugin

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

var x = customClass.CallStatic<float>("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:\ Program Files   (86)\统一\编辑\数据\ PlaybackEngines \ AndroidPlayer \变化\单\发布\类   \的 classes.jar

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

当我构建Unity项目时(使用“内部”构建系统),它给了我这个错误:

  

IOException:无法移动文件/目录   'Temp / StagingArea \ android-libraries \ mylibrary-release \ classes.jar'来   '温度/ StagingArea \机器人的库\在MyLibrary释放\库\ classes.jar' 的即可。   UnityEditor.Android.PostProcessor.Tasks.ProcessAAR.Execute   ...

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

  

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

     

stderr [未翻译的错误:   java.lang.IllegalArgumentException:已添加:   Lbitter / jnibridge / JNIBridge;未捕获的翻译错误:   java.lang.IllegalArgumentException:已添加:   Lbitter / jnibridge / JNIBridge $一个;未捕获的翻译错误:   java.lang.IllegalArgumentException:已添加:   LCOM / unity3d /播放/ NativeLoader;未捕获的翻译错误:   java.lang.IllegalArgumentException:已添加:   LCOM / unity3d /播放/ ReflectionHelper;未捕获的翻译错误:   java.lang.IllegalArgumentException:已添加:   LCOM / unity3d /播放/ ReflectionHelper $ 1;未捕获的翻译错误:   java.lang.IllegalArgumentException:已添加:   LCOM / unity3d /播放/ ReflectionHelper $一个;未捕获的翻译错误:   java.lang.IllegalArgumentException:已添加:   LCOM / unity3d /播放/ UnityPlayer;未捕获的翻译错误:   java.lang.IllegalArgumentException:已添加:   LCOM / unity3d /播放/ UnityPlayer $ 1;未捕获的翻译错误:   java.lang.IllegalArgumentException:已添加:   LCOM / unity3d /播放/ UnityPlayer $ 10;   ...

1 个答案:

答案 0 :(得分:4)

classes.jar (之后您将其重命名为&#39; unity_classes.jar&#39;)自动包含在Unity 构建的.apk 中,所以你不应该再自己包括它(在你的Android插件中),甚至用不同的名字

换句话说,首先你的android插件&#34;嵌入&#34;这个.jar文件本身。然后,当Unity将您的插件添加到游戏项目中时,它还会添加自己的.jar文件副本(它会为所有Android项目执行此操作)。因此,Unity本质上最终会在项目中拥有同一个.jar文件的2个副本,并抱怨说无法将类转换为dex格式&#39;。

因此,虽然您必须在项目中使用此库(.jar文件),但不应将此库与项目捆绑在一起。怎么做?如果您正在使用Android studio,则可以通过将.jar文件标记为provided scope的依赖项来实现此目的。

为此,您可以:

1)转到&#39; build.gradle&#39;您的模块并更改此内容:

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

到此:

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

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