Unity AndroidJavaObject передает плавающий массив в качестве выходного параметра

#c# #unity3d #android-unity-plugin

#c# #unity3d #android-unity-plugin

Вопрос:

У меня есть этот метод Java

 public class Test {
  double calculate(float[] array){
    array[0] = 2.0f;
    return 3.0f;
  }
}
 

Я интегрировал этот метод Java через архив Android в Unity. Я получаю доступ к этому методу следующим образом:

 var javaObject = new AndroidJavaObject("Test");
float[] inOut = new float[1];
double res = javaObject.Call<double>("calculate", inOut);
 

Теперь переменная res содержит значение 3.0f, как и ожидалось. Но у массива inOut все еще есть 0 в позиции индекса 0, но он должен иметь 2.0f;

Как мне правильно передать массив примитивов в Java-код из Unity и использовать его в качестве аргумента «inOut»?

Спасибо

Комментарии:

1. Что ж, вам следует переосмыслить свой код. Массив с плавающей запятой передается как копия, поэтому изменяется только копия, в то время как исходный массив inOut остается неизменным. Возможно, вам следует создать 2 метода, один из которых возвращает double, а другой — возвращает массив. Конечно, я не знаю, каков ваш вариант использования и чего именно вы пытаетесь достичь.

2. Насколько я знаю, как Java, так и C # используют «Вызов по ссылке». Таким образом, объект (= float[]) Я перехожу к методу, который не должен копироваться, а использоваться напрямую. Я проверил это поведение с помощью быстрого теста как на C #, так и на Java.

3. Очевидно, что в этой ситуации этого не происходит. При обмене данными между C # и Java вы получаете копию. Я не уверен, есть ли способ сделать то, что вы хотите, но есть четкие решения для его обхода.