Xamarin.Android JmDNS 绑定问题 [英] Xamarin.Android JmDNS binding issues

查看:37
本文介绍了Xamarin.Android JmDNS 绑定问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我开始研究 Xamarin.Android 的 JmDNS 绑定.我设法获得了要构建的绑定,但无法从我的代码中引用它.https://github.com/ytn3rd/monodroid-bindings/tree/master/JmDNS

我遇到的第一个问题是没有 IDNSListener 类可供参考.所以我在那里添加了一个部分接口.我有它需要的功能 void updateRecord(DNSCache dnsCache, long now, DNSEntry record);注释掉,因为它会抱怨无法引用 DNSCache 或 DNSEntry.(我相信我删除了 DNSCache,这就是原因)

不确定我所做的某些事情是否不好,只是删除节点以使其编译.例如.我添加了这个以消除以下错误.

<块引用>

E:\Users\brads_000\Documents\GitHub\ytn3rd\monodroid-bindings\JmDNS\bindings\obj\Debug\generated\src\Javax.Jmdns.Impl.JmDNSImpl.cs(24,24):错误 CS0738:Javax.Jmdns.Impl.JmDNSImpl.SubTypeEntry"没有实现接口成员'Java.Util.IMapEntry.Key'.'Javax.Jmdns.Impl.JmDNSImpl.SubTypeEntry.Key' 无法实现'Java.Util.IMapEntry.Key' 因为它没有匹配的返回'Java.Lang.Object' 的类型.(CS0738) (JmDNS-绑定)E:\Users\brads_000\Documents\GitHub\ytn3rd\monodroid-bindings\JmDNS\bindings\obj\Debug\generated\src\Javax.Jmdns.Impl.JmDNSImpl.cs(24,24):错误 CS0738:Javax.Jmdns.Impl.JmDNSImpl.SubTypeEntry"没有实现接口成员'Java.Util.IMapEntry.Value'.'Javax.Jmdns.Impl.JmDNSImpl.SubTypeEntry.Value' 无法实现'Java.Util.IMapEntry.Value' 因为它没有匹配'Java.Lang.Object' 的返回类型.(CS0738) (JmDNS-绑定)

问题来自 Java.Util.IMapEntry 类.我认为正确的操作是创建我自己的 parital SubEntryType,然后覆盖字符串 Key 属性,但它不会选择它.我的下一个尝试就是这样做.

<块引用>

Java.Lang.Object

这将解决该错误,但随后会导致错误

<块引用>

E:\Users\brads_000\Documents\GitHub\ytn3rd\monodroid-bindings\JmDNS\bindings\obj\Debug\generated\src\Javax.Jmdns.Impl.JmDNSImpl.cs(12,12):错误 CS1502:最佳重载方法匹配'Android.Runtime.JNIEnv.NewString(string)' 有一些无效的参数(CS1502) (JmDNS-绑定)

static IntPtr n_GetKey (IntPtr jnienv, IntPtr native__this){global::Javax.Jmdns.Impl.JmDNSImpl.SubTypeEntry __this = global::Java.Lang.Object.GetObject(jnienv, native__this, JniHandleOwnership.DoNotTransfer);返回 JNIEnv.NewString (__this.Key);}命名空间 Javax.Jmdns.Impl{公共分部类 SubTypeEntry{静态 IntPtr n_GetKey (IntPtr jnienv, IntPtr native__this){global::Javax.Jmdns.Impl.JmDNSImpl.SubTypeEntry __this = global::Java.Lang.Object.GetObject(jnienv, native__this, JniHandleOwnership.DoNotTransfer);返回 JNIEnv.NewString(__this.Key.ToString());}}}

但同样,它不想采用这种新方法.

我删除了 javax.jmdns.impl.DNSCache 因为与上述键/值相同的错误,

<块引用>

E:\Users\brads_000\Documents\GitHub\ytn3rd\monodroid-bindings\JmDNS\bindings\obj\Debug\generated\src\Javax.Jmdns.Impl.DNSCache.cs(95,95):错误 CS0508:Javax.Jmdns.Impl.DNSCache.EntrySet()":必须返回类型是 'System.Collections.ICollection' 以匹配被覆盖的成员'Java.Util.AbstractMap.EntrySet()' (CS0508) (JmDNS-Bindings)

我似乎已经修复了

<块引用>

System.Collections.ICollection

即使它已经返回.
public override global::System.Collections.Generic.ICollection EntrySet()

无论如何,如果您能帮助我们启动并运行这个很棒的库,我们将不胜感激:)

解决方案

我能够正确构建绑定项目.要正确构建它,请尝试使用以下方法.

1.从jmdns-3.4.1源码重建jar文件.公开 DNSListener 接口.删除测试包.然后导出源码,获取更新后的jar文件.

2.更新在步骤 1 中创建的 jar 文件.确保将构建操作更新为 EmbededJar.

3.EnumMethods.xml

<映射 jni-class="javax/jmdns/impl/DNSCache"><method jni-name="entrySet" parameter="return" clr-enum-type="System.Collections.ICollection"/></映射><映射 jni-class="javax/jmdns/impl/DNSCache._CacheEntry"><method jni-name="getKey" parameter="return" clr-enum-type="Java.Lang.Object"/></映射><映射 jni-class="javax/jmdns/impl/DNSCache._CacheEntry"><method jni-name="getValue" parameter="return" clr-enum-type="Java.Lang.Object"/></映射><mapping jni-class="javax/jmdns/impl/JmDNSImpl.ServiceTypeEntry.SubTypeEntry"><method jni-name="getKey" parameter="return" clr-enum-type="Java.Lang.Object"/></映射><mapping jni-class="javax/jmdns/impl/JmDNSImpl.ServiceTypeEntry.SubTypeEntry"><method jni-name="getValue" parameter="return" clr-enum-type="Java.Lang.Object"/></映射><映射 jni-class="javax/jmdns/impl/JmDNSImpl.ServiceTypeEntry"><method jni-name="entrySet" parameter="return" clr-enum-type="System.Collections.ICollection"/></映射></enum-method-mappings>

4.在您的示例应用中,您必须再添加一项权限作为 android.permission.ACCESS_WIFI_STATE.

5.此外,所有网络操作都应从后台线程执行并在主线程中通知 UI.因此,相应地更新您的 MainActivity 类.

希望这能帮助您正确创建构建.示例代码的工作副本在这里上传https://github.com/Hitangshu/JmDNS_Xamarin_Library

I started work on a JmDNS bindings for Xamarin.Android. I managed to get the binding to build but I can not reference it from within my code. https://github.com/ytn3rd/monodroid-bindings/tree/master/JmDNS

First issue I had was there was no IDNSListener class to reference. So I added a partial interface in there for it. I have the function it needs void updateRecord(DNSCache dnsCache, long now, DNSEntry record); commented out as it would complain on not being able to reference DNSCache or DNSEntry. (I believe I removed DNSCache and thats why)

Not sure if some of the things I have done were bad, just removing nodes to get it to compile. For instnace. I added this to remove to following errors.

E:\Users\brads_000\Documents\GitHub\ytn3rd\monodroid-bindings\JmDNS\bindings\obj\Debug\generated\src\Javax.Jmdns.Impl.JmDNSImpl.cs(24,24): Error CS0738: 'Javax.Jmdns.Impl.JmDNSImpl.SubTypeEntry' does not implement interface member 'Java.Util.IMapEntry.Key'. 'Javax.Jmdns.Impl.JmDNSImpl.SubTypeEntry.Key' cannot implement 'Java.Util.IMapEntry.Key' because it does not have the matching return type of 'Java.Lang.Object'. (CS0738) (JmDNS-Bindings) E:\Users\brads_000\Documents\GitHub\ytn3rd\monodroid-bindings\JmDNS\bindings\obj\Debug\generated\src\Javax.Jmdns.Impl.JmDNSImpl.cs(24,24): Error CS0738: 'Javax.Jmdns.Impl.JmDNSImpl.SubTypeEntry' does not implement interface member 'Java.Util.IMapEntry.Value'. 'Javax.Jmdns.Impl.JmDNSImpl.SubTypeEntry.Value' cannot implement 'Java.Util.IMapEntry.Value' because it does not have the matching return type of 'Java.Lang.Object'. (CS0738) (JmDNS-Bindings)

Issue is from the Java.Util.IMapEntry class. I thought correct action would be to create my own parital SubEntryType and then override the string Key property but it would not pick it up. My next attempt was to do this.

Java.Lang.Object

Which would resolve that error, but would then cause an error with

E:\Users\brads_000\Documents\GitHub\ytn3rd\monodroid-bindings\JmDNS\bindings\obj\Debug\generated\src\Javax.Jmdns.Impl.JmDNSImpl.cs(12,12): Error CS1502: The best overloaded method match for 'Android.Runtime.JNIEnv.NewString(string)' has some invalid arguments (CS1502) (JmDNS-Bindings)

static IntPtr n_GetKey (IntPtr jnienv, IntPtr native__this)
{
    global::Javax.Jmdns.Impl.JmDNSImpl.SubTypeEntry __this = global::Java.Lang.Object.GetObject<global::Javax.Jmdns.Impl.JmDNSImpl.SubTypeEntry> (jnienv, native__this, JniHandleOwnership.DoNotTransfer);
    return JNIEnv.NewString (__this.Key);
}
namespace Javax.Jmdns.Impl
{
    public partial class SubTypeEntry
    {
        static IntPtr n_GetKey (IntPtr jnienv, IntPtr native__this)
        {
            global::Javax.Jmdns.Impl.JmDNSImpl.SubTypeEntry __this = global::Java.Lang.Object.GetObject<global::Javax.Jmdns.Impl.JmDNSImpl.SubTypeEntry> (jnienv, native__this, JniHandleOwnership.DoNotTransfer);
            return JNIEnv.NewString(__this.Key.ToString());
        }
    }
}

But again, it does not want to pick this new method up.

I removed javax.jmdns.impl.DNSCache because of same errors with Key/Value as above and,

E:\Users\brads_000\Documents\GitHub\ytn3rd\monodroid-bindings\JmDNS\bindings\obj\Debug\generated\src\Javax.Jmdns.Impl.DNSCache.cs(95,95): Error CS0508: 'Javax.Jmdns.Impl.DNSCache.EntrySet()': return type must be 'System.Collections.ICollection' to match overridden member 'Java.Util.AbstractMap.EntrySet()' (CS0508) (JmDNS-Bindings)

Which I seemed to have fixed with

System.Collections.ICollection

Even though it is what it was already returning.
public override global::System.Collections.Generic.ICollection EntrySet ()

Anyway, any help would be appreciated to get this awesome library up and running :)

解决方案

I was able to build it the binding project correctly. To build it correct please try with the following approach.

1.Rebuild the jar file from the jmdns-3.4.1 source. Make the DNSListener interface public. Remove the test packages. Then export the source to get the updated jar file.

2.Update the jar file created from step 1. Make sure to update the build action to EmbededJar.

3.EnumMethods.xml

<enum-method-mappings>
  <mapping jni-class="javax/jmdns/impl/DNSCache">
    <method jni-name="entrySet" parameter="return" clr-enum-type="System.Collections.ICollection" />
  </mapping>

  <mapping jni-class="javax/jmdns/impl/DNSCache._CacheEntry">
    <method jni-name="getKey" parameter="return" clr-enum-type="Java.Lang.Object" />
  </mapping>

  <mapping jni-class="javax/jmdns/impl/DNSCache._CacheEntry">
    <method jni-name="getValue" parameter="return" clr-enum-type="Java.Lang.Object" />
  </mapping>

  <mapping jni-class="javax/jmdns/impl/JmDNSImpl.ServiceTypeEntry.SubTypeEntry">
    <method jni-name="getKey" parameter="return" clr-enum-type="Java.Lang.Object" />
  </mapping>

  <mapping jni-class="javax/jmdns/impl/JmDNSImpl.ServiceTypeEntry.SubTypeEntry">
    <method jni-name="getValue" parameter="return" clr-enum-type="Java.Lang.Object" />
  </mapping>

  <mapping jni-class="javax/jmdns/impl/JmDNSImpl.ServiceTypeEntry">
    <method jni-name="entrySet" parameter="return" clr-enum-type="System.Collections.ICollection" />
  </mapping>

</enum-method-mappings>

4.In your sample app you have to add one more permission as android.permission.ACCESS_WIFI_STATE.

5.Also all the network operation should be performed from a background thread and notify UI in Main thread. So update your MainActivity class accordingly.

Hope this will help you to create the build correctly. The working copy of the sample code is uploaded here https://github.com/Hitangshu/JmDNS_Xamarin_Library

这篇关于Xamarin.Android JmDNS 绑定问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆