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代码中可以捕获异常吗?谢谢!
首先,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