【问题标题】:Unity app calling jar only once on the first android buildUnity 应用程序在第一个 android 构建时仅调用一次 jar
【发布时间】:2017-06-19 23:26:20
【问题描述】:

使用$ adb logcat -s "app"$ adb logcat -s Unity 查看我在Terminal 中的调试消息,我注意到我的JAR 文件仅在我第一次 时被查询一次 > 将我的应用程序构建到Android (.APK) 但之后每次我只是run 我的应用程序,插件JAR 文件不会被咨询。这是为什么呢?

public class MyClass
{
    public static void MyMethod()
    {
        Log.i("app", "MyMethod entered");

        if (blah)
        {
            Log.d("app", "If entered");
        }
        else
        {
            Log.e("app", "Else entered");
        }

        blah
    }
}

使用$ adb logcat -s "app" 我看到Log.iLog.d 消息,在我的Unity3D 代码下面,我看到Debug.Log 消息使用$ adb logcat -s Unity

public class MyUnityClass : MonoBehaviour
{
    public static void MyUnityMethod()
    {
        #if UNITY_ANDROID
        try
        {
            using ( AndroidJavaObject androidJavaObject = new AndroidJavaObject("com.example.unityplugin.MyClass") )
            {
                if (androidJavaObject != null)
                {
                    androidJavaObject.CallStatic("MyMethod");
                    Debug.Log("androidJavaObject != null SUCCESS!");
                }
            }
        }
        catch (Exception e)
        {
            Debug.LogException(e);
        }
        #endif
    }
}

每次我在平板电脑上运行我的应用程序时,一个脚本会调用MyUnityMethod(),而该脚本又会调用我的JAR 中的MyMethod(),但在第一次构建之后,我再也看不到那些调试消息了...

【问题讨论】:

    标签: android unity3d jar logcat


    【解决方案1】:

    您必须使用AndroidJavaClass 而不是AndroidJavaObject。另外,不要每次都创建和销毁对象。不要用using 语句将代码括起来。只需将变量声明为全局变量,然后重新使用它。

    Java

    public class MyClass
    {
    
        public static void MyMethod()
        {
            Log.i("app", "MyMethod entered");
        }
    }
    

    C#

    AndroidJavaClass customClass;
    
    void Start()
    {
        //Replace with your full package name
        customClass = new AndroidJavaClass("com.example.unityplugin.MyClass");
    
        //Call function
        MyMethod();
    }
    
    public void MyMethod()
    {
        customClass.CallStatic("MyMethod");
    }
    

    如果您需要 MyMethod 函数是静态的,那么将 customClass 变量也设为 static

    C#

    static AndroidJavaClass customClass;
    
    void Start()
    {
        //Replace with your full package name
        customClass = new AndroidJavaClass("com.example.unityplugin.MyClass");
    
        //Call function
        MyMethod();
    }
    
    public static void MyMethod()
    {
        customClass.CallStatic("MyMethod");
    }
    

    【讨论】:

    • “你必须使用 AndroidJavaClass 而不是 AndroidJavaObject”——我认为这是不正确的。您可以使用 AndroidJavaObject 实例调用静态方法。
    • 是的,AndroidJavaObject 可以根据文档示例使用,但我个人也遇到了问题。当我切换到AndroidJavaClass 时,问题就消失了。从那以后我一直在使用AndroidJavaClass。这就是为什么我鼓励 OP 使用对我有用的东西。
    • AndroidJavaClass 派生自 AndroidJavaObject。此外,它没有定义任何新方法(构造函数除外)。当您调用 CallStatic 时,您实际上是在调用 AndroidJavaObject 方法。应该完全没有什么不同。
    • 是的,我知道这一点。构造函数是不同的,我认为这会有所不同。如果 OP 发现这不起作用,那么我会解决它。虽然,我希望它能够工作。
    猜你喜欢
    • 2017-04-06
    • 1970-01-01
    • 2020-12-31
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多