2016-09-21 34 views
1

例如从C#处理Java插件异常?

的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));

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

回答

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,捕获异常,异常转换成JSON与JSONObject然后返回结果到C#和使用JsonUtility

+0

由于得到各数据,以及还有更多,你建议返回哪种类型的json对象,或者只是一个可以反序列化为json对象的字符串?顺便说一句,我对AndroidJavaClass有疑问。它是JNI的实现还是应用程序?他们之间有什么关系?谢谢:) – Niubility

+0

我想你应该返回字符串**而不是**对象使用JsonUtility来得到结果和错误。至于'AndroidJavaClass',我不知道它是如何实现的。对于那个很抱歉 – Programmer