2016-08-25 3 views
0

Я сделал привязку JNI в Xamarin для проекта Android, над которым я работаю. Исходная Java-функция, представляющая интерес, приняла пустой ArrayList<String> как один из входных параметров и добавила содержимое в список как часть функции (изменение самого объекта).как передать список привязке в xamarin

При преобразовании в C# код, тип входного списка был изменен на:

global::System.Collections.Generic.IList<string>. 

Возвращаемое значение функции остается неизменным, но список входных больше не модифицируется. Я думаю, что это имеет какое-то отношение к тому, как привязка обрабатывает сортировку параметров функции.

Есть ли что-то, что я должен сделать, чтобы изменить привязку, чтобы изменить входной параметр (p2 в сгенерированном коде C#, показанном ниже)?

public static unsafe int ProcessAudioBuffer (short[] p0, int p1, global::System.Collections.Generic.IList<string> p2) 
     { 
      if (id_processAudioBuffer_arraySILjava_util_List_ == IntPtr.Zero) 
       id_processAudioBuffer_arraySILjava_util_List_ = JNIEnv.GetStaticMethodID (class_ref, "processAudioBuffer", "([SILjava/util/List;)I"); 
      IntPtr native_p0 = JNIEnv.NewArray (p0); 
      IntPtr native_p2 = global::Android.Runtime.JavaList<string>.ToLocalJniHandle (p2); 

      try { 
       JValue* __args = stackalloc JValue [3]; 
       __args [0] = new JValue (native_p0); 
       __args [1] = new JValue (p1); 
       __args [2] = new JValue (native_p2); 
       int __ret = JNIEnv.CallStaticIntMethod (class_ref, id_processAudioBuffer_arraySILjava_util_List_, __args); 
       return __ret; 
      } finally { 
       if (p0 != null) { 
        JNIEnv.CopyArray (native_p0, p0); 
        JNIEnv.DeleteLocalRef (native_p0); 
       } 
       JNIEnv.DeleteLocalRef (native_p2); 
      } 
     } 

ответ

0

Pass в Android.Runtime.JavaList<string>, где ваша функция ожидает System.Collections.Generic.IList<string>. Android.Runtime.JavaList<T> реализует интерфейс NET System.Collections.Generic.IList<string>.

В официальной документации Xamarin для JavaList<T> указано следующее.

ArrayList - это реализация IList, подкрепленная массивом. [...] Этот класс является хорошим выбором в качестве вашего по умолчанию List.

Я подозреваю, что проблема с использованием чистого .NET типа, такие как List<T> является то, что он не наследует от Java.Lang.Object и, следовательно, нет Java аналог изменить. Следовательно, вы не видите изменения, отраженные после вызова функции.

У меня была аналогичная проблема при использовании привязки OpenCV в Xamarin, и передача в Android.Runtime.JavaList<T> решила проблему.

Смежные вопросы