绑定Jar库

时间:2012-11-23 18:59:48

标签: android xamarin.android java-binding

我正在尝试在MFA上绑定一个jar库(jCIFS),但我遇到了一些错误,比如这个错误:

'Jcifs.Util.MD4'未实现继承的抽象成员'Java.Security.MessageDigestSpi.EngineDigest()

经过一些研究,我发现了一些关于此的主题,告诉编辑元数据以更改类的权限,如下所示:

<attr path="/api/package[@name='java.security']/class[@name='MessageDigestSpi']/method[@name='engineDigest']" name="visibility">public</attr>

但错误没有改变,仍然无法得到这个错误的含义。

任何人?

编辑:这是给我错误的虚拟类代码:

    public virtual byte[] EngineDigest ()
    {
        if (id_engineDigest == IntPtr.Zero)
            id_engineDigest = JNIEnv.GetMethodID (class_ref, "engineDigest", "()[B");

        if (GetType () == ThresholdType)
            return (byte[]) JNIEnv.GetArray (JNIEnv.CallObjectMethod  (Handle, id_engineDigest), JniHandleOwnership.TransferLocalRef, typeof (byte));
        else
            return (byte[]) JNIEnv.GetArray (JNIEnv.CallNonvirtualObjectMethod  (Handle, ThresholdClass, id_engineDigest), JniHandleOwnership.TransferLocalRef, typeof (byte));
    }

我在一个新文件中添加了这个:

partial class MD4
{
    public override byte[] EngineDigest()
    {
        return null;
    }
}

如果我这样做,则会返回此错误:

错误1类型'Jcifs.Util.MD4'已经定义了一个名为'EngineDigest'的成员,其参数类型相同

据我所知,EngineDigest方法已经存在,但是类需要实现它。我是怎么做到的?

完整错误:错误195'Jcifs.Util.MD4'未实现继承的抽象成员'Java.Security.MessageDigestSpi.EngineDigest()'

编辑2:我尝试使用来自xamarin网站的OsmDroidBinding示例来回复问题。我编辑了元文件,直到我收到类似的错误。我找到的其中一条线是这一条:

<attr path="/api/package[@name='org.osmdroid.tileprovider']/class[@name='MapTileProviderBase.ScaleTileLooper']/method[@name='handleTile']" name="visibility">public</attr>

我收到此错误: Error

然后我尝试将其添加到我的项目元文件中(如上所述),但错误仍然存​​在:

<attr path="/api/package[@name='java.security']/class[@name='MessageDigestSpi']/method[@name='engineDigest']" name="visibility">public</attr>

感谢。

2 个答案:

答案 0 :(得分:2)

它告诉您生成的类Jcifs.Util.MD4没有实现继承的抽象方法。抽象方法是必须由任何派生类重写的方法。

下面的代码将基类方法的可见性更改为public,这显然无法解决问题。

<attr path="/api/package[@name='java.security']/class[@name='MessageDigestSpi']/method[@name='engineDigest']" name="visibility">public</attr>

有几种方法可以解决此错误。也许最简单的方法是将一个类文件添加到Java绑定库中,并将以下代码添加到它中。

namespace Jcifs.Util
{
    public partial class MD4
    {
        public override void EngineDigest()
        {

        }
    }
}

注意您需要将EngineDigest()的返回类型更改为为基类中的抽象方法定义的返回类型。您没有在问题中提到退货类型,因此我将其设为void

答案 1 :(得分:0)

更改

public override byte [] EngineDigest()

protected override byte [] EngineDigest()