将Card.IO移植到C#Xamarin Studio

时间:2013-12-07 17:43:17

标签: android xamarin.android xamarin card.io

我在尝试将Card.IO移植到Xamarin Android时遇到了麻烦。由于我使用的是C#而不是Java,我不知道如何处理.so文件和.jar文件。

我尝试按照此处发布的一些步骤进行操作:card.io Mono for Android (Xamarin Studio)但我收到以下两个构建错误,我不知道如何解决。

这是我到目前为止所做的事情

  1. 创建新的Android Java Bindings Library Project

  2. 使用现有的文件夹结构从Card.IO项目添加.jar和.so文件。因此/ libs文件夹下有四个子文件夹,然后/ libs下有一个jar。

  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. 在我的主应用程序中添加对上述库的引用。

  5. 然后我遇到了这些构建错误:

      

    命名空间中不存在类型或命名空间名称“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 {
    

    任何帮助都很有用,谢谢!

1 个答案:

答案 0 :(得分:6)

我已经花了大约10个小时的时间来获得卡片我使用我的xamarin应用程序...经过长时间的长时间战斗后,我设法看到我想要的...我没有看到关于2个接口的上述错误,我'A'类中的'a'字段存在问题,并且存在错误,告诉“IN”接口不存在(这是一个接口,因此不应该在那里显示双基类的问题,这很奇怪)。

不确定我的所有步骤是否都是必要的,以使其工作,但(惊讶,惊讶)我是累了清理它并检查哪些chagnes真的是essencial。很多问题都是由卡片的代码混淆引起的。 没关系,回到主题:

  1. 创建新的绑定项目,将jar添加为embeded jar,将.so文件添加为嵌入式本机库(使用现有结构)
  2. 打开EnumMethods.xml并添加一个映射:
  3. <mapping jni-class="io/card/payment/CardIOActivity">

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

    </mapping>

    (这会将.net xamarin在onActivityResult方法中使用的枚举类型更改为int(由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>
    

    以上节点将一些可见性更改为公共(最需要)并更改一些类或表面的名称(不确定是否需要,但在某些时候对我有用)

    1. 在主要项目中添加对绑定项目的引用。

    2. 在主项目中打开AndroidManifest.xml并添加:

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

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

      应该在应用程序节点(主节点的子节点 - 清单)下添加

      节点

      1. 现在你应该能够调用CardIOActivity并使用你想要的东西(调用和使用是可用的,似乎在创作者提供的例子中有很好的描述)

      2. 还有一个提示,没有什么大不了,但是当我最终成功地让图书馆工作时我错过了...在OnActivityResult方法中获得结果作为CreditResult对象使用java cast: var scanResult = data.GetParcelableExtra(CardIOActivity.ExtraScanResult).JavaCast(); 普通的c#cast不起作用。

      3. 如果你有任何问题让我知道,也许我错过了一些东西(特别是我还不是xamarin专家)。

        祝你好运!

        ps:回答@xamarin论坛也是

        编辑: 完整的解决方案与绑定,检查和工作上传到github: https://github.com/wiadran/card.io.xamarin.binding.git