2016-09-21 73 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