Android 机器人绑定海绵城堡/弹性城堡

Android 机器人绑定海绵城堡/弹性城堡,android,xamarin,xamarin.android,bouncycastle,spongycastle,Android,Xamarin,Xamarin.android,Bouncycastle,Spongycastle,有人成功绑定到Xamarin.Android吗?在绑定项目中,我的Metadata.xml遇到了一堆警告 到目前为止,我已经: <remove-node path="/api/package[@name='org.spongycastle.x509']" /> <remove-node path="/api/package[@name='org.spongycastle.crypto']" /> <remove-node path="/api/package[@na

有人成功绑定到Xamarin.Android吗?在绑定项目中,我的Metadata.xml遇到了一堆警告

到目前为止,我已经:

<remove-node path="/api/package[@name='org.spongycastle.x509']" />
<remove-node path="/api/package[@name='org.spongycastle.crypto']" />
<remove-node path="/api/package[@name='org.spongycastle.crypto.tls']" />
<remove-node path="/api/package[@name='org.spongycastle.cms']" />
<remove-node path="/api/package[@name='org.spongycastle.crypto.prng']" />
<remove-node path="/api/package[@name='org.spongycastle.openpgp']" />
<remove-node path="/api/package[@name='org.spongycastle.openssl']" />
<remove-node path="/api/package[@name='org.spongycastle.cert.ocsp']" />

<remove-node path="/api/package[@name='org.spongycastle.jcajce']" />
<remove-node path="/api/package[@name='org.spongycastle.jcajce.provider.asymmetric.dh']" />
<remove-node path="/api/package[@name='org.spongycastle.jcajce.provider.asymmetric.ec']" />
<remove-node path="/api/package[@name='org.spongycastle.jcajce.provider.digest']" />
<remove-node path="/api/package[@name='org.spongycastle.jcajce.provider.keystore.bc']" />
<remove-node path="/api/package[@name='org.spongycastle.jcajce.provider.symmetric']" />

<remove-node path="/api/package[@name='org.spongycastle.jcajce.provider.asymmetric.dsa']" />
<remove-node path="/api/package[@name='org.spongycastle.jcajce.provider.asymmetric.util']" />
<remove-node path="/api/package[@name='org.spongycastle.jcajce.provider.symmetric.util']" />
<remove-node path="/api/package[@name='org.spongycastle.jcajce.provider.asymmetric.gost']" />
<remove-node path="/api/package[@name='org.spongycastle.jcajce.provider.asymmetric.ies']" />
<remove-node path="/api/package[@name='org.spongycastle.jcajce.provider.asymmetric.rsa']" />
<remove-node path="/api/package[@name='org.spongycastle.jcajce.provider.asymmetric.x509']" />

<remove-node path="/api/package[@name='org.spongycastle.jce.provider']/class[@name='CertStoreCollectionSpi']" />
<remove-node path="/api/package[@name='org.spongycastle.jce.provider']/class[@name='MultiCertStoreSpi']" />
<remove-node path="/api/package[@name='org.spongycastle.jce.provider']/class[@name='X509CRLEntryObject']" />
<remove-node path="/api/package[@name='org.spongycastle.jce.provider']/class[@name='X509CRLObject']" />
<remove-node path="/api/package[@name='org.spongycastle.jce.provider']/class[@name='X509CertificateObject']" />
<remove-node path="/api/package[@name='org.spongycastle.jce.provider']/class[@name='X509LDAPCertStoreSpi']"/>
<remove-node path="/api/package[@name='org.spongycastle.jce.provider']/class[@name='PKIXPolicyNode']" />

<remove-node path="/api/package[@name='org.spongycastle.pqc.jcajce.provider.rainbow']" />
<remove-node path="/api/package[@name='org.spongycastle.pqc.jcajce.provider.mceliece']"/>
<remove-node path="/api/package[@name='org.spongycastle.pqc.jcajce.provider.util']" />
<remove-node path="/api/package[@name='org.spongycastle.pqc.crypto.ntru']" />
<remove-node path="/api/package[@name='org.spongycastle.pqc.math.ntru.polynomial']" />

因此它可以编译,但是在Xamarin.Android项目中使用绑定项目需要几分钟。编译,然后它就无法抱怨Java的堆大小

当我将堆大小设置为1GB时,它就完成了,但当在设备上以调试模式运行应用程序时,调试就会中断

有没有办法不用绑定库就直接使用ARR?我只需要调用我在这个ARR中创建的包装器方法,并从中获得输出。我不需要通过C#访问整个库。还是有更好的办法

更新: 当我构建CPU时,看起来是这样的(看看Java):
通过
ARR
,你的意思是
AAR
?如果仅使用某些项目,您可以直接使用
JNI

最简单的方法是把你不想保留的所有物品的
,然后处理你想保留的物品。但是,您可能需要确保保留依赖项,以便它们正确绑定。这会很快变得很糟糕

我有一个通用指南,它可能在某些方面有助于此绑定:

正如@jzeferino所提到的,你总是可以使用比自己绑定更具战斗力的东西

BouncyCastle PCL:

PCL加密:


这两种方法都提供了各自的加密方法来完成任务。在PCLCrypto的例子中,它们要么是由Mono的实现提供的,要么是由平台的实现提供的。

我最终在绑定项目的metadata.xml文件中删除了几乎所有与BouncyCastle和SpongyCastle相关的内容。然后,我从绑定项目中的GeneratedFiles文件夹复制了生成的BouncyCastleProvider的部分内容。因此,我只为需要调用的部分创建了自己的JNI包装器

它工作得很好。现在编译时间缩短到几秒钟,调试期间部署速度很快。我喜欢第三方图书馆

我的做法是首先生成C#类,然后选择在我自己的库中实现部分JNI,并在Metadata.xml中添加/删除节点

using System;
using System.Collections.Generic;
using Android.Runtime;
namespace Org.Spongycastle.Jce.Provider
{

// Metadata.xml XPath class reference: path="/api/package[@name='org.spongycastle.jce.provider']/class[@name='BouncyCastleProvider']"
[global::Android.Runtime.Register("org/spongycastle/jce/provider/BouncyCastleProvider", DoNotGenerateAcw = true)]
public sealed partial class BouncyCastleProvider : global::Java.Security.Provider
{
    // Metadata.xml XPath field reference: path="/api/package[@name='org.spongycastle.jce.provider']/class[@name='BouncyCastleProvider']/field[@name='PROVIDER_NAME']"
    [Register("PROVIDER_NAME")]
    public const string ProviderName = (string)"SC";

    internal static IntPtr java_class_handle;
    internal static IntPtr class_ref
    {
        get
        {
            return JNIEnv.FindClass("org/spongycastle/jce/provider/BouncyCastleProvider", ref java_class_handle);
        }
    }

    protected override IntPtr ThresholdClass
    {
        get { return class_ref; }
    }

    protected override global::System.Type ThresholdType
    {
        get { return typeof(BouncyCastleProvider); }
    }

    internal BouncyCastleProvider(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer) { }

    static IntPtr id_ctor;
    // Metadata.xml XPath constructor reference: path="/api/package[@name='org.spongycastle.jce.provider']/class[@name='BouncyCastleProvider']/constructor[@name='BouncyCastleProvider' and count(parameter)=0]"
    [Register(".ctor", "()V", "")]
    public unsafe BouncyCastleProvider()
        : base(IntPtr.Zero, JniHandleOwnership.DoNotTransfer)
    {
        if (Handle != IntPtr.Zero)
            return;

        try
        {
            if (GetType() != typeof(BouncyCastleProvider))
            {
                SetHandle(
                        global::Android.Runtime.JNIEnv.StartCreateInstance(GetType(), "()V"),
                        JniHandleOwnership.TransferLocalRef);
                global::Android.Runtime.JNIEnv.FinishCreateInstance(Handle, "()V");
                return;
            }

            if (id_ctor == IntPtr.Zero)
                id_ctor = JNIEnv.GetMethodID(class_ref, "<init>", "()V");
            SetHandle(
                    global::Android.Runtime.JNIEnv.StartCreateInstance(class_ref, id_ctor),
                    JniHandleOwnership.TransferLocalRef);
            JNIEnv.FinishCreateInstance(Handle, class_ref, id_ctor);
        }
        finally
        {
        }
    }
}
}
使用系统;
使用System.Collections.Generic;
使用Android.Runtime;
命名空间Org.Spongycastle.Jce.Provider
{
//Metadata.xml XPath类引用:path=“/api/package[@name='org.spongycastle.jce.provider']/class[@name='BouncyCastleProvider']”
[global::Android.Runtime.Register(“org/spongycastle/jce/provider/BouncyCastleProvider”,DoNotGenerateAcw=true)]
公共密封部分类BouncyCastleProvider:global::Java.Security.Provider
{
//Metadata.xml XPath字段引用:path=“/api/package[@name='org.spongycastle.jce.provider']/class[@name='BouncyCastleProvider']/field[@name='provider\u name']”
[注册(“提供商名称”)]
public const string ProviderName=(字符串)“SC”;
内部静态IntPtr java_类_句柄;
内部静态IntPtr类\u参考
{
得到
{
返回JNIEnv.FindClass(“org/spongycastle/jce/provider/BouncyCastleProvider”,ref java_class_handle);
}
}
受保护的重写IntPtr ThresholdClass
{
获取{return class_ref;}
}
受保护的覆盖全局::System.Type ThresholdType
{
获取{返回类型(BouncyCastleProvider);}
}
内部BouncyCastleProvider(IntPtr javaReference,JNIHandleOwnery transfer):base(javaReference,transfer){}
静态IntPtr id检测器;
//Metadata.xml XPath构造函数引用:path=“/api/package[@name='org.spongycastle.jce.provider']/class[@name='BouncyCastleProvider']/constructor[@name='BouncyCastleProvider'和count(参数)=0]”
[寄存器(“.ctor”,“()V”,”)]
公共不安全BouncyCastleProvider()
:base(IntPtr.Zero、JniHandleOwnership.DoNotTransfer)
{
if(Handle!=IntPtr.Zero)
返回;
尝试
{
if(GetType()!=typeof(BouncyCastleProvider))
{
设定手柄(
全局::Android.Runtime.JNIEnv.StartCreateInstance(GetType(),“()V”),
JniHandleOwnership.TransferLocalRef);
全局::Android.Runtime.JNIEnv.FinishCreateInstance(句柄,“()V”);
返回;
}
if(id_ctor==IntPtr.Zero)
id_ctor=JNIEnv.GetMethodID(class_ref,“,”()V”);
设定手柄(
全局::Android.Runtime.JNIEnv.StartCreateInstance(class\u ref,id\u ctor),
JniHandleOwnership.TransferLocalRef);
FinishCreateInstance(句柄、类引用、id引用);
}
最后
{
}
}
}
}

为什么不使用Bouncy Castle?我不是密码专家,但当各种论坛上有这么多人表示:“不幸的是,android平台为android提供了一个不完整且过时的Bouncy Castle版本,这也使得很难安装更新版本的库。也就是说,我们必须坚持使用Spongy Castle,一个重新打包的Bouncy Castle版本,以使其在Android上工作。“-我选择海绵城堡。参考:最近我在pcl和Android中使用了bouncy castle。没问题。这可能取决于你需要做什么。我有一个依赖于几个图书馆做相当多的整洁的东西与NFC。因此,我有依赖关系的库建议使用SpongyCastle。无论如何,这更多的是解决从Xamarin到Java的绑定/调用,而不是需要什么样的库。@chrisva我认为这是最好的选择,这就是为什么我说搬到Bouncy Castle。是的,我的意思是AAR。谢谢你为我指明了已经在那里的PCL的方向。我很了解他们。我的第三方库依赖于Spongy Castle,所以我不是在寻找一种简单的aro方法