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"
我做错了什么?静态调用和非静态调用有什么区别?我正在使用相同的 Activity 。这是我的 Java 方法:
public void testMethod(String data) { }
更新
终于可以运行非静态方法了:
activity.Call("runOnUiThread", new AndroidJavaRunnable(() =>
{
activity.Call("testMethod", "testString");
}));
如果没有 runOnUIThread 就无法正常工作……可能是我做错了什么。
最佳答案
虽然您可能已经解决了问题,但我相信真正的问题出在其他地方。我已经帮助为 Unity 创建了很多插件,所以我只想在这里表达我的想法,供您阅读以及可能面临相同或类似问题的任何其他人阅读。
首先,您使用了 UIThread 来调用您的非静态公共(public)方法。这非常好,但前提是在 native 代码中执行某些 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强>")
尝试上面的代码,它应该将“The data was testString”打印到 logcat。
在您的 C# 代码中,您使用了 currentActivity
字段来调用您的方法。
相反,您想要做的是为您的类创建一个 AndroidJavaObject
或 AndroidJavaClass
扩展 UnityPlayerActivity
("MyClass.java"在上面的示例中)并调用您的方法。
关于android - 统一: Call android function from Unity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27550280/