android - 统一: Call android function from Unity

标签 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"

我做错了什么?静态调用和非静态调用有什么区别?我正在使用相同的 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 字段来调用您的方法。

相反,您想要做的是为您的类创建一个 AndroidJavaObjectAndroidJavaClass 扩展 UnityPlayerActivity ("MyClass.java"在上面的示例中)并调用您的方法。

关于android - 统一: Call android function from Unity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27550280/

相关文章:

android - 我如何获得 Activity 而不是 FragmentActivty?

ios - iOS 上的 Unity3D,在 Obj-C 中检查设备相机图像

c# - Unity table 游AI导致内存泄露

android - 找不到符号返回 DaggerApplication_HiltComponents_SingletonC.builder()

android - 如何实现水平gridlayoutmanager

android - 亚马逊代购API错误: com. amazon.testclient.iap.purchase not found

android - 磁场、旋转矩阵和全局坐标

unity3d - 在 Monodevelop Unity 5.2 中看不到 javascript 文件

android - Unity3D 错误 "Failed to initialize Unity graphics"

c# - 从暂停菜单退出以从标题屏幕重新启动 C#