【问题标题】:Unity: Call android function from UnityUnity:从 Unity 调用 android 函数
【发布时间】:2015-02-17 11:00:36
【问题描述】:
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");

AndroidJavaObject activity = unityPlayer.GetStatic("currentActivity");

activity.CallStatic("testMethod");

这就是我不带参数调用 Android 静态函数的方式,它的工作原理很完美。但是当我尝试使用参数调用非静态函数时遇到问题。

我试着这样称呼它:

activity.Call("testMethod", "testString");

但是Android会抛出异常:

AndroidJavaException: java.lang.NoSuchMethodError: no non-static method "L**myActivity**(Ljava/lang/String;)V"

我做错了什么?静态调用和非静态调用有什么区别?我正在使用相同的活动。这是我的java方法:

public void testMethod(String data) { }

更新

终于可以运行非静态方法了:

activity.Call("runOnUiThread", new AndroidJavaRunnable(() =>
                                                                   {
                    activity.Call("testMethod", "testString");
            }));

如果没有 runOnUIThread,那奇怪的事情就无法工作......可能我做错了什么。

【问题讨论】:

  • 我可以看看你的原生安卓代码吗?我有同样的问题,我不确定你为什么叫 currentActivity
  • 在我们和更友好的 API 之间存在哪些技术障碍?

标签: android unity3d


【解决方案1】:

虽然您可能已经解决了这个问题,但我相信真正的问题出在其他地方。我已经帮助为 Unity 创建了很多插件,所以我只想在这里表达我的想法,供您阅读,也供任何可能面临相同或类似问题的人阅读。

首先,您使用 UIThread 来调用您的非静态公共方法。这很好,但前提是在本机代码中执行某些 UI 操作,例如显示 toast。否则,问题出在其他地方。

通常,如果您创建一个方法,它将位于扩展UnityPlayerActivity 的单独类中。例如,假设您将其命名为“MyClass.java”

这可能是您的 Java Native 类的样子

原生 Android 代码

package com.companyName.productName;

import com.unity3d.player.UnityPlayerActivity;
import com.unity3d.player.UnityPlayer;

public class MyClass extends UnityPlayerActivity {    

    public void testMethod(String data) { 
        Log.i("TAG", "The data was "+data);
    }
}


现在在 Unity 端,您的 C# 脚本应该如下所示

Unity C# 代码

AndroidJavaClass myClass = new AndroidJavaClass("com.companyName.productName.MyClass");

myClass.Call("testMethod", new object[] { "testString" } );


注意我是如何使用实际的 Java 类而不是 UnityPlayerActivity(即“com.companyName.productName.MyClass”而不是“com.unity3d.player.UnityPlayer强>")


试试上面的代码,它应该将“数据是testString”打印到logcat。

在您的 C# 代码中,您使用了 currentActivity 字段来调用您的方法。

相反,您要做的是创建扩展 UnityPlayerActivity 的类的 AndroidJavaObjectAndroidJavaClass(上例中为“MyClass.java”)并调用您的方法。

【讨论】:

    【解决方案2】:

    在 .jar 文件中声明 testMethod(public) 你?

    如果不声明方法,请尝试制作 .jar 文件。

    【讨论】:

      【解决方案3】:

      它应该工作。实际上我正在使用像你这样的非静态方法调用。

      您是否更新了 Assets/Plugins/Android 下的 jar 文件?

      【讨论】:

      • 我做到了。最后我能够运行非静态方法。检查我的更新我是如何做到的。
      猜你喜欢
      • 1970-01-01
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多