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那就不行了......可能我做错了。
答案 0 :(得分:12)
虽然您可能已经解决了这个问题,但我认为真正的问题在于其他地方。我已经帮助为Unity创建了很多插件,所以我只想在这里提出你的想法,让你阅读以及其他可能遇到相同或类似问题的人。
首先,您使用了UIThread来调用非静态的公共方法。这非常好,但只有在本机代码中执行某些UI操作时才会显示,例如显示吐司。否则,问题出在其他地方。
通常,如果您创建一个方法,它将在一个扩展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
字段来调用您的方法。
相反,您要做的是创建扩展AndroidJavaObject
(上例中为“MyClass.java”)的类的AndroidJavaClass
或UnityPlayerActivity
并调用您的方法
答案 1 :(得分:0)
它应该工作。实际上,我使用非静态方法调用你的。
您是否在Assets / Plugins / Android下更新了jar文件?
答案 2 :(得分:0)
在.jar文件中声明testMethod(public)吗?
如果您没有声明方法,请尝试make .jar文件。