在C#中使用Androidjavaobject可以将二维数组传输到Java?并返回
问题描述:
我正在Unity3D & Android跨平台项目。在C#中使用Androidjavaobject可以将二维数组传输到Java?并返回
我想提高性能,所以我改变了我的代码。
这是我第一次尝试。
在C#
string str = JO.Call<string> ("GetDevices");
在Java中
public String GetDevices() {
String devices = "";
/* ... */
return devices;
}
它的工作原理,但我不喜欢这样。
所以,我改成了这样:
在C#
string[,] str = new string[deviceNum,2];
str = JO.Call<string[,]> ("GetDevices");
在Java
public String[][] GetDevices() {
String[][] devices = {{""}};
/* ... */
return devices;
}
但它不工作。我究竟做错了什么?
这是我第一次尝试日志:
I/Unity: Exception: JNI: System.Array in n dimensions is not allowed
at UnityEngine._AndroidJNIHelper.GetSignature (System.Object obj) [0x00000] in <filename unknown>:0
at UnityEngine._AndroidJNIHelper.GetSignature[String[,]] (System.Object[] args) [0x00000] in <filename unknown>:0
at UnityEngine._AndroidJNIHelper.GetMethodID[String[,]] (IntPtr jclass, System.String methodName, System.Object[] args, Boolean isStatic) [0x00000] in <filename unknown>:0
at UnityEngine.AndroidJNIHelper.GetMethodID[String[,]] (IntPtr jclass, System.String methodName, System.Object[] args, Boolean isStatic) [0x00000] in <filename unknown>:0
at UnityEngine.AndroidJavaObject._Call[String[,]] (System.String methodName, System.Object[] args) [0x00000] in <filename unknown>:0
at UnityEngine.AndroidJavaObject.Call[String[,]] (System.String methodName, System.Object[] args) [0x00000] in <filename unknown>:0
我试着 “PEF” 的方式和日志这样
07-18 10:21:58.318 18999-19055/? I/Unity: Exception: JNI: Unknown generic array type 'System.String[]'
at UnityEngine._AndroidJNIHelper.ConvertFromJNIArray[String[][]] (IntPtr array) [0x00000] in <filename unknown>:0
at UnityEngine.AndroidJNIHelper.ConvertFromJNIArray[String[][]] (IntPtr array) [0x00000] in <filename unknown>:0
at UnityEngine.AndroidJavaObject._Call[String[][]] (System.String methodName, System.Object[] args) [0x00000] in <filename unknown>:0
at UnityEngine.AndroidJavaObject.Call[String[][]] (System.String methodName, System.Object[] args) [0x00000] in <filename unknown>:0
答
最后,我解决这个问题
在C#
string[] devicesstr = new string[deviceNum*2];
devicesstr = tcamJO.Call<string[]> ("GetDevices");
在Java
public String[] GetDevices() {
String[] devices = {"",};
/* ... */
devices = new String[cameraIds.length * 2];
int j =0;
for (int i = 0; i < cameraIds.length + 1; i += 2) {
devices[i] = cameraIds[j++];
/* .... */
if (facing != null && facing == CameraCharacteristics.LENS_FACING_FRONT) {
devices[i+1] = "1";
} else {
devices[i+1] = "0";
}
}
}
答
您正在使用C#代码多维数组,其与您在java代码中使用的阵列数组不同。
有关差异的详细信息请看这里:What are the differences between a multidimensional array and an array of arrays in C#?
你可以尝试:
string[][] str = new string[2][];
str[0] = new string[deviceNum];
str[1] = new string[deviceNum];
str = JO.Call<string[][]> ("GetDevices");
并注意数组维度的顺序。
@stefanobaghino谢谢stefanobaghino – kimjinyam