Unity:从Unity调用android函数

时间:2014-12-18 15:38:38

标签: android unity3d

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那就不行了......可能我做错了。

3 个答案:

答案 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”)的类的AndroidJavaClassUnityPlayerActivity并调用您的方法

答案 1 :(得分:0)

它应该工作。实际上,我使用非静态方法调用你的。

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

答案 2 :(得分:0)

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

如果您没有声明方法,请尝试make .jar文件。