Портирование Card.IO на C # Xamarin Studio

У меня возникли проблемы с попыткой переноса Card.IO на Xamarin Android. Поскольку я использую C # вместо Java, я не знаю, что делать с .so-файлами и файлами .jar.

Я попытался выполнить некоторые из приведенных здесь шагов: card.io Mono для Android (Xamarin Studio), но я получаю следующие две ошибки сборки, которые я не знаю, как их решить.

Вот что я сделал до сих пор

  1. Создайте новый проект библиотеки приложений Java Java Bindings

  2. Добавьте файлы .jar и .so из проекта Card.IO с существующей структурой папок. Таким образом, в папке / libs есть четыре подпапки, а затем одна банка под / libs.

  3. Добавьте в Transforms / EnumMethods.xml следующее, чтобы решить ошибку компилятора:

    <mapping jni-class="io/card/payment/CardIOActivity"> <method jni-name="onActivityResult" parameter="p1" clr-enum-type="Android.App.Result" /> </mapping> 
  4. Добавьте ссылку на приведенную выше библиотеку в моем основном приложении.

И тогда я столкнулся с этими ошибками сборки:

Тип или имя пространства имен «IN» не существует в пространстве имен «IO.Card.Payment» (вам не хватает ссылки на сборку?)

'A': имена участников не могут быть такими же, как и их закрывающий тип

Обновить

Первая ошибка в этой строке:

 public sealed partial class CardIOActivity : global::Android.App.Activity, global::IO.Card.Payment.IN { 

Кажется, что вторая ошибка в этой строке:

 public static global::System.Collections.IList A { 

Любая помощь полезна, спасибо!

Я потратил как 10 часов в день, чтобы получить карточку io, работающую с моим приложением xamarin … после долгих длинных битв мне удалось увидеть то, что я хотел … я не видел вышеупомянутую ошибку около двух интерфейсов, у меня была Выпуски с полем «a» в классе «A» и там как ошибка, указывающая, что интерфейс «IN» не существует (это интерфейс, поэтому никаких проблем с двойным базовым классом не следует показывать там, это нечетно).

Не уверен, что все мои шаги необходимы, чтобы заставить его работать, но (удивление, удивление), я был устал, чтобы очистить это и проверить, какие чаны были действительно сущностными. Много проблем вызвано запутыванием кода карты io jar. Nevermind, вернемся к теме:

  1. Создать новый проект привязки, добавить банку в качестве встроенного jar, добавить файлы .so в качестве встроенных библиотек (использовать существующую структуру)
  2. Откройте EnumMethods.xml и добавьте туда отображение:

<mapping jni-class="io/card/payment/CardIOActivity">

<method jni-name="onActivityResult" parameter="p1" clr-enum-type="Android.App.Result" />

</mapping>

(Это изменяет int на тип перечисления, используемый .net xamarin в методе onActivityResult (который перегружен одним из классов в card.io.jar). 3. Откройте Metadata.xml и добавьте ниже узлов (некоторые из них могут быть ненужными):

 <attr path="/api/package[@name='io.card.payment']/class[@name='A']/field[@name='a']" name="managedName">AProp</attr> <attr path="/api/package[@name='io.card.payment']/class[@name='M']" name="visibility">public</attr> <attr path="/api/package[@name='io.card.payment']/class[@name='M']" name="name">Mcl</attr> <attr path="/api/package[@name='io.card.payment']/interface[@name='N']" name="visibility">public</attr> <attr path="/api/package[@name='io.card.payment']/interface[@name='N']" name="name">Nifc</attr> <attr path="/api/package[@name='io.card.payment']/class[@name='L']" name="visibility">public</attr> <attr path="/api/package[@name='io.card.payment']/class[@name='L']/field[@name='a']" name="managedName">aProp</attr> <attr path="/api/package[@name='io.card.payment']/class[@name='L']/method[@name='a']" name="managedName">aMethod</attr> <attr path="/api/package[@name='io.card.payment']/class[@name='L']" name="name">Lcl</attr> 

Выше узлы меняют некоторые видимости на общественность (наиболее необходимо) и изменяют некоторые имена классов или iterfaces (не уверены, если это необходимо, но это было полезно для меня в какой-то момент)

  1. Добавьте ссылку на проект привязки в основной.

  2. Откройте AndroidManifest.xml в главном проекте и добавьте туда:

<activity android:name="io.card.payment.CardIOActivity" android:configChanges="keyboardHidden|orientation" />

<activity android:name="io.card.payment.DataEntryActivity" android:screenOrientation="portrait"/>

Узлы должны быть добавлены под узлом приложения (который является дочерним элементом основного узла – манифест)

  1. Теперь вы должны иметь возможность ссылаться на CardIOActivity и использовать то, что вы хотите (использование и использование доступно и, как представляется, хорошо описано в примерах, предоставленных создателями)

  2. Еще один намек, ничего большого, но когда мне наконец удалось получить работу библиотеки, я пропустил ее … чтобы получить результат, поскольку объект CreditResult в методе OnActivityResult использует java cast: var scanResult = data.GetParcelableExtra (CardIOActivity.ExtraScanResult) .JavaCast ( ); Обычный c # cast не работает.

Если у вас есть какие-либо проблемы, дайте мне знать, возможно, я что-то пропустил (особенно, что я еще не эксперт по xamarin).

удачи!

Ps: ответ размещен на форуме @xamarin

EDIT: Завершите решение с привязкой, проверено и обработано до уровня github: https://github.com/wiadran/card.io.xamarin.binding.git