【问题标题】:Xamarin Android binding does not implement interface issueXamarin Android 绑定未实现接口问题
【发布时间】:2021-02-10 11:46:17
【问题描述】:

我有一个适用于 android 的 java 绑定,它在我试图与之集成的新功能中有些工作。直到现在我才意识到预期的回调没有发生。以下是有问题的类(反编译为 java):

在顶层我们有

public interface MyPackage {
   MyPackage.Companion Companion = MyPackage.Companion.$$INSTANCE;

public static final class Companion {
      @Nullable
      private static MyEventHandler myEventHandler;
      // $FF: synthetic field
      static final MyPackage.Companion $$INSTANCE;

      @Nullable
      public final MyEventHandler getMyEventHandler() {
         return myEventHandler;
      }

      public final void setMyEventHandler(@Nullable MyEventHandler var1) {
         myEventHandler = var1;
      }

      private Companion() {
      }

      static {
         MyPackage.Companion var0 = new MyPackage.Companion();
         $$INSTANCE = var0;
      }
   }
}

MyEventHandler类:

public abstract class MyEventHandler {
   public abstract void handleEvent(@NotNull String var1, @NotNull Properties var2);
}

Properties类:

import java.util.Map;

public class Properties extends r {
    public Properties() {
    }

    Properties(Map<String, Object> var1) {
        super(var1);
    }

    public Properties a(String var1, Object var2) {
        super.b(var1, var2);
        return this;
    }
}

还有有问题的r类:

public class r implements Map<String, Object> {
    private final Map<String, Object> a;
various implementations...
}

所以当我无法在集成级别覆盖HandleEvent 方法并开始查看绑定日志并发现时,我注意到了这个问题:

警告=>

BINDINGSGENERATOR: Warning BG8801: Invalid parameter type MyPackage...Properties in method HandleEvent in managed type MyPackage.MyEventHandler. (BG8801)

在构建日志中:

message BG0000: warning BG8102: Class MyPackage....Properties has unknown base type MyPackage....r.

warning BG8801: Invalid parameter type MyPackage...Properties in method HandleEvent in managed type MyPackage.MyEventHandler.

很明显r 是一个混淆类,我需要对我的Metadata 进行更改,所以我继续前进并弹出:

<attr path="/api/package[@name='MyPackage']/class[@name='r']" name="obfuscated">false</attr>

这导致 R 被生成,但现在我得到 5 以下编译错误:

Error CS0535: 'R' does not implement interface member 'IMap.EntrySet()' (CS0535) 
Error CS0738: 'R' does not implement interface member 'IMap.KeySet()'. 'R.KeySet()' cannot implement 'IMap.KeySet()' because it does not have the matching return type of 'ICollection'. (CS0738)
Error CS0535: 'R' does not implement interface member 'IMap.Put(Object?, Object?)' (CS0535)
Error CS0535: 'R' does not implement interface member 'IMap.PutAll(IDictionary?)' (CS0535)
Error CS0738: 'R' does not implement interface member 'IMap.Values()'. 'R.Values()' cannot implement 'IMap.Values()' because it does not have the matching return type of 'ICollection'. (CS0738)

我尝试使用

进行管理回报
<attr path="/api/package[@name='MyPackage']/class[@name='r']/method[@name='entrySet' and count(parameter)=0]" name="managedReturn">Java.Util.IMap</attr>

与上述相同数量的编译错误。然后我尝试使用以下方法删除节点:

<remove-node path="/api/package[@name='MyPackage']/class[@name='r']/method[@name='entrySet']"/>

仍然没有运气。 :(

我在这里缺少什么?任何指针/建议将不胜感激!

【问题讨论】:

    标签: xamarin.forms xamarin.android xamarin-binding


    【解决方案1】:

    您似乎正在尝试向 C# 公开 Map,并且正如您所说,Java 泛型处理得不是很好。

    在一个非常受欢迎的社交网络中,您收到了来自@mattleibow 的回复。我不相信他的回答,但我还是去检查了一下,看起来还不错。

    如果你看一下Java.Lang.HashMap类型的描述 https://docs.microsoft.com/en-us/dotnet/api/java.util.hashmap?view=xamarin-android-sdk-9是你曝光的好人选。

    你也可以试试对应的接口更安全https://docs.microsoft.com/en-us/dotnet/api/java.util.imap?view=xamarin-android-sdk-9

    如果它有效,您仍然需要自己转换类型。

    请回复评论说为了后代到达此帖子而解决问题:D

    信用不是我的,所以不要给我:-)

    约翰,

    【讨论】:

    • 嗨,约翰,感谢您的指点。那你建议我试试&lt;attr path="/api/package[@name='MyPackage']/class[@name='r']/method[@name='entrySet' and count(parameter)=0]" name="managedReturn"&gt;Java.Util.IMap&lt;/attr&gt; 吗?
    • managedReturn 属性仅适用于返回类型。在这里,您的问题是您的类型 r 没有实现 Map 接口,您可以在警告中看到缺少的元素。您基本上有两种选择,要么手动添加节点,因为它们现在存在,要么更改基本类型以删除 IMap 接口。你可以在这里查看我是怎么做的:github.com/johnthiriet/Xamarin.Android.Huawei.Hms/blob/master/… 寻找:Java.Lang.Object
    【解决方案2】:

    我通过在部分类中提供上述方法的实现来解决它。基本上在Additions文件夹下添加了一个名为R.cs的新文件,如下:

    namespace YourNameSpace
    {
        public partial class R
        {
            public void PutAll(System.Collections.IDictionary p0)
            {
                PutAll(p0);
            }
    
            public Java.Lang.Object Put(Java.Lang.Object key, Java.Lang.Object value)
            {
                return Put(key, value);
            }
    
            public System.Collections.ICollection EntrySet()
            {
                return EntrySet();
            }
    
            public System.Collections.ICollection KeySet()
            {
                return KeySet();
            }
    
            public System.Collections.ICollection Values()
            {
                return Values();
            }
        }
    }
    

    我无法通过添加 XML 转换使其工作,但我认为存在一些工具问题。

    【讨论】:

      猜你喜欢
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      相关资源
      最近更新 更多