我创建了一个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; ...
答案 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)并将其范围更改为提供。