我试着按照这里发布的一些步骤:card.io Mono for Android (Xamarin Studio)但我得到以下两个构建错误,我不知道如何解决.
这是我到目前为止所做的
>创建一个新的Android Java Bindings Library项目
>使用现有文件夹结构从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>
>在我的主应用程序中添加对上述库的引用.
然后我遇到了这些构建错误:
The type or namespace name ‘IN’ does not exist in the namespace
‘IO.Card.Payment’ (are you missing an assembly reference?)‘A’: member names cannot be the same as their enclosing type
更新
第一个错误是在这一行:
public sealed partial class CardioActivity : global::Android.App.Activity,global::IO.Card.Payment.IN {
第二个错误似乎在这一行:
public static global::System.Collections.IList A {
任何帮助都很有用,谢谢!
解决方法
不确定我的所有步骤是否都是必要的,以使其工作,但(惊讶,惊讶)我是累了清理它,并检查哪些chagnes真的是essencial.很多问题都是由卡片的代码混淆引起的.
没关系,回到主题:
>创建新的绑定项目,将jar添加为embeded jar,将.so文件添加为嵌入式本机库(使用现有结构)
>打开EnumMethods.xml并添加一个映射:
< mapping jni-class =“io / card / payment / CardioActivity”>
< method jni-name =“onActivityResult”parameter =“p1”clr-enum-type =“Android.App.Result”/>
< /映射>
(这会将.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