Unity:从Unity调用android函数

Jim*_*Jim 4 android unity-game-engine

AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");

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

activity.CallStatic("testMethod");
Run Code Online (Sandbox Code Playgroud)

这就是我如何在没有参数的情况下调用Android静态函数,并且它的工作完美.但是当我试图用参数调用非静态函数时,我遇到了问题.

我试着这样称呼它:

activity.Call("testMethod", "testString");
Run Code Online (Sandbox Code Playgroud)

但Android抛出异常:

AndroidJavaException: java.lang.NoSuchMethodError: no non-static method "L**myActivity**(Ljava/lang/String;)V"
Run Code Online (Sandbox Code Playgroud)

我做错了什么?静态和非静态呼叫有什么区别?我正在使用相同的活动.这是我的java方法:

public void testMethod(String data) { }
Run Code Online (Sandbox Code Playgroud)

UPDATE

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

activity.Call("runOnUiThread", new AndroidJavaRunnable(() =>
                                                                   {
                    activity.Call("testMethod", "testString");
            }));
Run Code Online (Sandbox Code Playgroud)

如果没有runOnUIThread就行不通......可能我做错了什么.

Ven*_*ios 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);
    }
}
Run Code Online (Sandbox Code Playgroud)


现在在Unity方面,您的C#脚本应该如下所示

Unity C#代码

AndroidJavaClass myClass = new AndroidJavaClass("com.companyName.productName.MyClass");

myClass.Call("testMethod", new object[] { "testString" } );
Run Code Online (Sandbox Code Playgroud)


注意我是如何使用实际的Java类而不是UnityPlayerActivity(即" com.companyName.productName.MyClass "而不是" com.unity3d.player.UnityPlayer ")


尝试上面的代码,它应该将" 数据是testString " 打印到logcat.

在您的C#代码中,您已使用该currentActivity字段来调用您的方法.

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


Kaz*_*oto 0

它应该有效。实际上我正在使用像你一样的非静态方法调用。

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