在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 
+0

@stefanobaghino谢谢stefanobaghino – kimjinyam

最后,我解决这个问题

在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"); 

并注意数组维度的顺序。

+0

如果你只取回数据,你可以省略第二和第三线。 – Pef

+0

谢谢Pef,我试过了你的建议。但没有解决。 – kimjinyam