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

时间:2016-09-21 06:39:57

标签: c# android unity3d java-native-interface

e.g。

Android部分



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;
  }
}




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));
&#13;
&#13;
&#13;

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

1 个答案:

答案 0 :(得分:2)

首先,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);
}
如果返回类型或参数不匹配,或者即使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;
}

您可以将函数返回类型更改为string,捕获异常,将异常转换为带有JSONObject的json,然后将结果返回到C#并使用JsonUtility <获取每个数据/ p>