我在尝试将Card.IO移植到Xamarin Android时遇到了麻烦。由于我使用的是C#而不是Java,我不知道如何处理.so文件和.jar文件。
我尝试按照此处发布的一些步骤进行操作:card.io Mono for Android (Xamarin Studio)但我收到以下两个构建错误,我不知道如何解决。
这是我到目前为止所做的事情
创建新的Android Java Bindings Library Project
使用现有的文件夹结构从Card.IO项目添加.jar和.so文件。因此/ libs文件夹下有四个子文件夹,然后/ libs下有一个jar。
将以下内容添加到Transforms / EnumMethods.xml以解决编译器错误:
<mapping jni-class="io/card/payment/CardIOActivity">
<method jni-name="onActivityResult" parameter="p1" clr-enum-type="Android.App.Result" />
</mapping>
在我的主应用程序中添加对上述库的引用。
然后我遇到了这些构建错误:
命名空间中不存在类型或命名空间名称“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 {
任何帮助都很有用,谢谢!
答案 0 :(得分:6)
不确定我的所有步骤是否都是必要的,以使其工作,但(惊讶,惊讶)我是累了清理它并检查哪些chagnes真的是essencial。很多问题都是由卡片的代码混淆引起的。 没关系,回到主题:
<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>
以上节点将一些可见性更改为公共(最需要)并更改一些类或表面的名称(不确定是否需要,但在某些时候对我有用)
在主要项目中添加对绑定项目的引用。
在主项目中打开AndroidManifest.xml并添加:
<activity android:name="io.card.payment.CardIOActivity" android:configChanges="keyboardHidden|orientation" />
<activity android:name="io.card.payment.DataEntryActivity" android:screenOrientation="portrait"/>
节点
现在你应该能够调用CardIOActivity并使用你想要的东西(调用和使用是可用的,似乎在创作者提供的例子中有很好的描述)
还有一个提示,没有什么大不了,但是当我最终成功地让图书馆工作时我错过了...在OnActivityResult方法中获得结果作为CreditResult对象使用java cast: var scanResult = data.GetParcelableExtra(CardIOActivity.ExtraScanResult).JavaCast(); 普通的c#cast不起作用。
如果你有任何问题让我知道,也许我错过了一些东西(特别是我还不是xamarin专家)。
祝你好运!ps:回答@xamarin论坛也是
编辑: 完整的解决方案与绑定,检查和工作上传到github: https://github.com/wiadran/card.io.xamarin.binding.git