处理来自 C# 的 Java 插件异常?

Niu*_*ity 5 c# java-native-interface android unity-game-engine

例如

安卓专区

public class MainActivity extends UnityPlayerActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
  }

  public int divide(int a, int b) throw Exception{
    return a / b;
  }
}
Run Code Online (Sandbox Code Playgroud)

Unity3D部分:

AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
int rlt = jo.Call<int>("divide", new object[](10, 0));
Run Code Online (Sandbox Code Playgroud)

显然,在Java中调用divide(10, 0)时会产生异常。但是,Unity3D代码中可以捕获异常吗?谢谢!

Pro*_*mer 5

首先,jo.Call<int>("divide", new object[](10, 0));甚至不应该编译。应该是这样jo.Call<int>("divide", new object[] { 10, 0 });

但是,Unity3D代码中可以捕获异常吗?

如果 Android 本机端抛出异常,您的应用程序将被终止。

例如,下面的代码:

AndroidJavaClass jc;
AndroidJavaObject jo;
int rlt;
try
{
    jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
    rlt = jo.Call<int>("divide", new object[] { 10, 0 });
}
catch (Exception e)
{
    Debug.Log("Error: " + e.Message);
}
Run Code Online (Sandbox Code Playgroud)

仅当返回类型或参数不匹配或者甚至函数divide根本不存在时才会捕获异常。

您必须从 Java 端捕获异常。

public int divide(int a, int b)
{
    int result = 0;
    try
    { 
        result = _divide(a, b);
    }catch(Exception e)
                      {
      //...
    }
    return result;
}

public int _divide(int a, int b) throw Exception{
    return a / b;
}
Run Code Online (Sandbox Code Playgroud)

您可以将函数返回类型更改为string,捕获异常,将异常转换为 json,JSONObject然后将结果返回到 C# 并使用以下方式获取每个数据JsonUtility