为什么Unity3d导入jar插件失败?

时间:2016-12-09 04:21:35

标签: java android android-studio unity3d

我有一个小的 Unity3d 项目,可以将 JAR 与它集成。 Android Studio库项目中的(简体)java类如下代码所示:

package com.playsqreen.library.api;

... imports ...

public class PlaysreenAPI {

    private static PlayscreenAPI _api;

    private PlayscreenAPI(Activity activity) {
        this.activity = activity;
    }

    // static method to create singleton
    public static PlayscreenAPI build(Activity activity, String key) {
        if (_api == null) {
            // post processing something
            // before returning instance of this class
            _api = new PlayscreenAPI(activity);
        }
        return _api;
    }

    public String doEchoThis(String msg) {
        return "ECHO: " + msg;
    }

}

因此,从Android Studio,我生成我的JAR并将其转储到 ../ MyProject / Assets / Plugins / Android ,从Unity IDE我可以看到如下所示:

enter image description here

然后我创建一个C#脚本,如下所示加载我的java类:

void Start () {
    _builder = new StringBuilder();
    try
    {
        _builder.Append(">>> Step 1\n");
        AndroidJavaClass activityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        if (activityClass != null)
        {
            _builder.Append(">>> Step 2\n");
            AndroidJavaObject activity = activityClass.GetStatic<AndroidJavaObject>("currentActivity");
            if (activity != null)
            {
                _builder.Append(">>> Step 3\n");
                AndroidJavaClass apiClass = new AndroidJavaClass("com.playsqreen.library.api.PlayscreenAPI");
                if (apiClass != null)
                {
                    _builder.Append(">>> Step 4\n");
                    object[] args = { activity, secretKey };
                    api = apiClass.CallStatic<AndroidJavaObject>("build", args);
                }
            }
        }
    }
    catch (System.Exception e)
    {
        _builder.Append(e.StackTrace.ToString());
    }
}

我在文字用户界面对象中打印 StringBuilder ,以便我捕获我的代码在哪个步骤制动,并且结果是第3步。我的Text UI对象打印出来:

java.lang.ClassNotFoundException:com.playsqreen.library.api.PlayscreenAPI and etc...

我在这里找到的一个帖子建议我使用 Java Decompiler 来检查来自this站点的jar类是否真正包含在Jar中。所以我做了,Java Decompiler显示我的java类确实存在(见下文)

enter image description here

所以我现在真的卡住了。如何从Unity加载我的java类?请帮忙。

感谢。

按照下面的麦角酸建议后,我将自定义jar所需的其余罐子包括在内,见下图。一切都很好:))

enter image description here

2 个答案:

答案 0 :(得分:2)

您没有发布在运行时获得的完整错误消息。另外你没有提到你的哪些调试打印得到打印,所以我会尝试提出一些你可以检查的不同问题。希望其中一个可以帮助解决问题:

  • JAR名称包含'。'(句点字符)。不确定Unity如何解释这一点(我自己从未使用过这样的命名约定)。在Unity中选择.JAR文件并确保Unity将其标记为Android插件(应该在插件导入器中选择“Android”。我还会尝试将其重命名为一个名称,而不需要任何句点,只需要安全侧。
  • 错误地调用Java方法:在您的示例中,Java中的静态方法 build 会收到一个参数(Activity),但是当您从中调用它时Unity,你传递了一个包含2个参数的数组。
  • 缺少依赖项:当您的本机Java代码依赖于其他类(例如:来自其他库)时,如果您没有将这些库包含在.JAR文件中,则不会加载您的类在运行时,它会因隐藏错误而失败,例如 NoClassDefFoundException 。确保包含所有依赖项。

**无耻的推广:**我提供修复Unity中Android相关问题的服务。 Check it out here,如果您有兴趣:)

答案 1 :(得分:0)

安装最新的JDK版本,然后重试。