首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >统一:从统一中调用android功能

统一:从统一中调用android功能
EN

Stack Overflow用户
提问于 2014-12-18 15:38:38
回答 3查看 21K关注 0票数 5
代码语言:javascript
运行
复制
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");

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

activity.CallStatic("testMethod");

这就是我如何在没有争论的情况下调用Android静态函数的方法,它的工作原理非常完美。但是当我试图用参数调用非静态函数时,我就有问题了。

我试着这样称呼它:

代码语言:javascript
运行
复制
activity.Call("testMethod", "testString");

但是Android抛出了异常:

代码语言:javascript
运行
复制
AndroidJavaException: java.lang.NoSuchMethodError: no non-static method "L**myActivity**(Ljava/lang/String;)V"

我做错了什么?静态调用和非静态调用有什么区别?我用的是同样的活动。下面是我的java方法:

代码语言:javascript
运行
复制
public void testMethod(String data) { }

更新

最后能够运行非静态方法:

代码语言:javascript
运行
复制
activity.Call("runOnUiThread", new AndroidJavaRunnable(() =>
                                                                   {
                    activity.Call("testMethod", "testString");
            }));

奇怪的是,没有runOnUIThread...Probably,我做了些错事。

EN

回答 3

Stack Overflow用户

发布于 2015-01-01 12:27:39

虽然你可能已经解决了这个问题,但我相信真正的问题在别处。我帮助创建了相当多的统一插件,所以我将把我的想法放在这里,让大家阅读,也让其他可能面临相同或类似问题的人阅读。

首先,您使用了一个UIThread来调用您的非静态公共方法。这是非常好的,但是只有在本机代码中执行了一些UI操作,例如显示祝酒词时。否则,问题就在别处。

通常,如果创建一个方法,它将位于一个扩展UnityPlayerActivity的单独类中。举个例子,假设你把它叫做"MyClass.java“

这可能是Java本机类的样子

原生安卓代码

代码语言:javascript
运行
复制
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#代码

代码语言:javascript
运行
复制
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字段来调用您的方法。

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

票数 12
EN

Stack Overflow用户

发布于 2014-12-18 16:24:58

应该管用的。实际上我是用非静态的方法调用你的。

您更新了资产/Plugins/Android下的jar文件吗?

票数 0
EN

Stack Overflow用户

发布于 2014-12-19 07:14:10

在testMethod文件中声明.jar (公共)?

如果不声明方法,则尝试生成.jar文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27550280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档