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...Probably,我做了些错事。
发布于 2015-01-01 12:27:39
虽然你可能已经解决了这个问题,但我相信真正的问题在别处。我帮助创建了相当多的统一插件,所以我将把我的想法放在这里,让大家阅读,也让其他可能面临相同或类似问题的人阅读。
首先,您使用了一个UIThread来调用您的非静态公共方法。这是非常好的,但是只有在本机代码中执行了一些UI操作,例如显示祝酒词时。否则,问题就在别处。
通常,如果创建一个方法,它将位于一个扩展UnityPlayerActivity的单独类中。举个例子,假设你把它叫做"MyClass.java“
这可能是Java本机类的样子
原生安卓代码
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);
}
}现在在统一方面,您的C#脚本应该如下所示
统一C#代码
AndroidJavaClass myClass = new AndroidJavaClass("com.companyName.productName.MyClass");
myClass.Call("testMethod", new object[] { "testString" } );注意我是如何使用实际的Java类而不是"com.unity3d.player.UnityPlayer") (即“com.unity3d.player.UnityPlayer”)而不是UnityPlayerActivity )的
尝试上面的代码,它应该将"The data it “打印到logcat。
在C#代码中,您使用了currentActivity字段来调用您的方法。
相反,您要做的是创建类的AndroidJavaObject或AndroidJavaClass,该类扩展UnityPlayerActivity (上面示例中的“MyClass.java”)并调用您的方法。
发布于 2014-12-18 16:24:58
应该管用的。实际上我是用非静态的方法调用你的。
您更新了资产/Plugins/Android下的jar文件吗?
发布于 2014-12-19 07:14:10
在testMethod文件中声明.jar (公共)?
如果不声明方法,则尝试生成.jar文件。
https://stackoverflow.com/questions/27550280
复制相似问题