2016-10-25 6 views
0

Я новичок в Xamarin с Visual Studio. Существует существующий проект xamarin android, в котором мне приходилось добавлять файлы Jar (SDK), поэтому я создал библиотеку привязки, однако он бросает некоторые ошибки, которые я пытаюсь решить, используя Metadata.xml, один из них следующим образом:ошибка CS0535 Класс не реализует член интерфейса

'DeviceService' не реализует элемент интерфейса 'IDeviceService.SetSignResult (ИНТ)'

Поиск в api.xml Я нашел это:

<class abstract="false" deprecated="not deprecated" extends="android.app.Service" extends-generic-aware="android.app.Service" final="false" name="DeviceService" static="false" visibility="public"> 
<implements name="com.company.deviceService.IDeviceService" name-generic-aware="com.company.deviceService.IDeviceService"> 
</implements> 
<constructor deprecated="not deprecated" final="false" name="DeviceService" static="false" type="com.company.deviceService.DeviceService" visibility="public"> 
</constructor> 
... 
<method abstract="false" deprecated="not deprecated" final="false" name="setSignResult" native="false" return="void" static="false" synchronized="false" visibility="public"> 
<parameter name="p0" type="int"> 
</parameter> 
</method> 

<method abstract="false" deprecated="not deprecated" final="false" name="getSignResult" native="false" return="int" static="false" synchronized="false" visibility="public"> 
</method> 
... 
</class> 

В интерфейсе есть такой метод:

IntPtr id_setSignResult_I; 
     public unsafe void SetSignResult (int p0) 
     { 
      if (id_setSignResult_I == IntPtr.Zero) 
       id_setSignResult_I = JNIEnv.GetMethodID (class_ref, "setSignResult", "(I)V"); 
      JValue* __args = stackalloc JValue [1]; 
      __args [0] = new JValue (p0); 
      JNIEnv.CallVoidMethod (Handle, id_setSignResult_I, __args); 
     } 

Однако при поиске в сгенерированный DeviceService.cs класса я нашел это:

static Delegate cb_setSignResult_I; 
#pragma warning disable 0169 
     static Delegate GetSetSignResult_IHandler() 
     { 
      if (cb_setSignResult_I == null) 
       cb_setSignResult_I = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, int>) n_SetSignResult_I); 
      return cb_setSignResult_I; 
     } 

     static void n_SetSignResult_I (IntPtr jnienv, IntPtr native__this, int p0) 
     { 
      global::com.company.deviceService.DeviceService __this = global::Java.Lang.Object.GetObject<global::com.company.deviceService.DeviceService> (jnienv, native__this, JniHandleOwnership.DoNotTransfer); 
      __this.SignResult = p0; 
     } 
#pragma warning restore 0169 

     static IntPtr id_getSignResult; 
     static IntPtr id_setSignResult_I; 

     public virtual unsafe int SignResult { 
      // Metadata.xml XPath method reference: path="/api/package[@name='com.company.deviceService']/class[@name='DeviceService']/method[@name='getSignResult' and count(parameter)=0]" 
      [Register ("getSignResult", "()I", "GetGetSignResultHandler")] 
      get { 
       if (id_getSignResult == IntPtr.Zero) 
        id_getSignResult = JNIEnv.GetMethodID (class_ref, "getSignResult", "()I"); 
       try { 

        if (GetType() == ThresholdType) 
         return JNIEnv.CallIntMethod (Handle, id_getSignResult); 
        else 
         return JNIEnv.CallNonvirtualIntMethod (Handle, ThresholdClass, JNIEnv.GetMethodID (ThresholdClass, "getSignResult", "()I")); 
       } finally { 
       } 
      } 
      // Metadata.xml XPath method reference: path="/api/package[@name='com.company.deviceService']/class[@name='DeviceService']/method[@name='setSignResult' and count(parameter)=1 and parameter[1][@type='int']]" 
      [Register ("setSignResult", "(I)V", "GetSetSignResult_IHandler")] 
      set { 
       if (id_setSignResult_I == IntPtr.Zero) 
        id_setSignResult_I = JNIEnv.GetMethodID (class_ref, "setSignResult", "(I)V"); 
       try { 
        JValue* __args = stackalloc JValue [1]; 
        __args [0] = new JValue (value); 

        if (GetType() == ThresholdType) 
         JNIEnv.CallVoidMethod (Handle, id_setSignResult_I, __args); 
        else 
         JNIEnv.CallNonvirtualVoidMethod (Handle, ThresholdClass, JNIEnv.GetMethodID (ThresholdClass, "setSignResult", "(I)V"), __args); 
       } finally { 
       } 
      } 
     } 

По какой-то причине Binding генератора неправильно выводить реализацию методы или тип возвращаемого значения, я не знаю, и, глядя в api.xml это представляется корректным: void setSignResult (int p0). Я пытался изменить поведение с помощью Metadata.xml с той же ошибкой:

<attr path="/api/package[@name='Com.Company.deviceservice']/class[@name='DeviceService']/method[@name='SetSignResult' 
    and count(parameter)=1 
    and parameter[1][@type='int']]/parameter[1]" 
    name="managedReturn">Java.Lang.Void</attr> 

Я искал другой реализации метода интерфейса, аналогично уже упоминалось выше, чтобы сравнить с ним, и я нашел, что это правильно генерирует метод, взять на вид :

static IntPtr id_bcrSymbologyToText_I; 
     [Register ("bcrSymbologyToText", "(I)Ljava/lang/String;", "GetBcrSymbologyToText_IHandler")] 

     public virtual unsafe string BcrSymbologyToText (int p0) 
     { 
      if (id_bcrSymbologyToText_I == IntPtr.Zero) 
       id_bcrSymbologyToText_I = JNIEnv.GetMethodID (class_ref, "bcrSymbologyToText", "(I)Ljava/lang/String;"); 
      try { 
       JValue* __args = stackalloc JValue [1]; 
       __args [0] = new JValue (p0); 

       if (GetType() == ThresholdType) 
        return JNIEnv.GetString (JNIEnv.CallObjectMethod (Handle, id_bcrSymbologyToText_I, __args), JniHandleOwnership.TransferLocalRef); 
       else 
        return JNIEnv.GetString (JNIEnv.CallNonvirtualObjectMethod (Handle, ThresholdClass, JNIEnv.GetMethodID (ThresholdClass, "bcrSymbologyToText", "(I)Ljava/lang/String;"), __args), JniHandleOwnership.TransferLocalRef); 
      } finally { 
      } 
     } 

Пожалуйста, свяжитесь с нами!

+0

Можете ли вы попытаться переместить «IntPtr id_setSignResult_I;» внутри функции? Кажется, что ему нужно делегировать его, когда он находится вне функции. Также я вижу в другой декларации функции, которая отсутствует в проблемной функции. –

+0

Нет, он не работал, перемещая IntPtr id_setSignResult_I. Такая же ошибка. –

+0

Атрибут [Регистрация]. Почему SetSignResult не имеет этого, но BcrSymbologyToText имеет? –

ответ

0

Найдено ответ:

Xamarin Binding генератор (который работает на Binding библиотеки), переводимые в неправильном пути из классов Java в C# классов некоторой коды Java, что он не может выполнить reingenieering, поэтому генератор создает setSignResult как результат свойства метода java. Способ исправления этих вещей использует metadata.xml для некоторых типов ошибок или же, реализуя в моем случае недостающий метод, создавая неполный класс с тем же именем с автогенерированным классом. Поскольку связывание генератор создан частичный класс DeviceService с его собственной реализации, я создал еще один DeviceService частичный класс, реализующий метод отсутствует при следующей реализации:

public partial class DeviceService 
    { 
     public void SetSignResult(int p) 
     { 
      SignResult = p; 
     } 
} 

Работает отлично!

спасибо