2017-07-14 72 views
0

我正在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

回答

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"; 
      } 
     } 
} 
1

您正在使用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