【问题标题】:Binding Jar Library绑定 Jar 库
【发布时间】:2025-09-16 13:50:01
【问题描述】:

我正在尝试在 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>

我得到这个错误:

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

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

谢谢。

【问题讨论】:

    标签: android xamarin.android java-binding


    【解决方案1】:

    它告诉你生成的类 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

    【讨论】:

    • 我缺乏一些 C# 技能,所以我无处可去。如果我添加此代码 VS 返回我“......已经定义了一个名为 EngineDigest 的成员具有相同的参数类型。我将编辑问题以获取更多信息
    【解决方案2】:

    改变

    公共覆盖字节[] EngineDigest ()

    受保护的覆盖字节[] EngineDigest ()

    【讨论】: