2014-05-23 11 views
7

Ich begann die Arbeit an einer JmDNS Bindungen für Xamarin.Android. Ich habe es geschafft, die Bindung zum Erstellen zu bekommen, aber ich kann nicht von meinem Code aus darauf verweisen. https://github.com/ytn3rd/monodroid-bindings/tree/master/JmDNSXamarin.Android JmDNS Bindungsprobleme

Die erste Frage, die ich hatte war, gab es keine IDNSListener-Klasse zu verweisen. Also habe ich eine partielle Schnittstelle dafür hinzugefügt. Ich habe die Funktion, die es benötigt, void updateRecord (DNSCache dnsCache, lang jetzt, DNSEntry-Datensatz); Auskommentiert, da es sich beschweren würde, nicht auf DNSCache oder DNSEntry verweisen zu können. (Ich glaube, ich DNSCache entfernt und das ist warum)

Nicht sicher, ob einige der Dinge, die ich getan habe, waren schlecht, nur Entfernen von Knoten, um es zu kompilieren. Für den Fall. Ich habe dies hinzugefügt, um folgende Fehler zu entfernen.

E: \ Benutzer \ brads_000 \ Dokumente GitHub \ \ ytn3rd \ monodroid-Bindungen \ JmDNS \ Bindungen \ obj \ Debug \ erzeugt \ src \ Javax.Jmdns.Impl.JmDNSImpl.cs (24,24): Fehler CS0738: 'Javax.Jmdns.Impl.JmDNSImpl.SubTypeEntry' implementiert nicht Interface Member 'Java.Util.IMapEntry.Key' implementieren. 'Javax.Jmdns.Impl.JmDNSImpl.SubTypeEntry.Key' kann 'Java.Util.IMapEntry.Key' nicht implementieren, da es nicht den übereinstimmenden Typ 'Java.Lang.Object' vom Typ zurückgibt. (CS0738) (JmDNS-Bindungen) E: \ Benutzer \ brads_000 \ Dokumente \ GitHub \ ytn3rd \ monodroid-bindings \ JmDNS \ bindings \ obj \ Debug \ generierte \ src \ Javax.Jmdns.Impl.JmDNSImpl.cs (24, 24): Fehler CS0738: 'Javax.Jmdns.Impl.JmDNSImpl.SubTypeEntry' implementiert nicht Interface Member 'Java.Util.IMapEntry.Value'. 'Javax.Jmdns.Impl.JmDNSImpl.SubTypeEntry.Value' kann 'Java.Util.IMapEntry.Value' nicht implementieren, da der Rückgabetyp von 'Java.Lang.Object' nicht vorhanden ist. (CS0738) (JmDNS-Bindungen)

Problem ist von der Java.Util.IMapEntry-Klasse. Ich dachte, dass korrekte Handlung sein würde, meinen eigenen paritalen SubEntryType zu schaffen und dann die Schnur Schlüsseleigenschaft zu überschreiben, aber sie würde es nicht aufheben. Mein nächster Versuch war, dies zu tun.

java.lang.Object

Welche diesen Fehler beheben wäre, würde aber dann einen Fehler verursachen mit

E: \ Benutzer \ brads_000 \ Dokumente \ GitHub \ ytn3rd \ monodroid -bindings \ JmDNS \ Bindings \ Obj \ Debug \ generierte \ src \ Javax.Jmdns.Impl.JmDNSImpl.cs (12,12): Fehler CS1502: die beste überladene Methodenübereinstimmung für 'Android.Runtime.JNIEnv.NewString (string) 'hat einige ungültige Argumente (CS1502) (JmDNS-Bind Ings)

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()); 
     } 
    } 
} 

Aber noch einmal, es will nicht diese neue Methode holen.

Ich entfernte javax.jmdns.impl.DNSCache wegen gleichen Fehler mit Schlüssel/Wert wie oben und

E: \ Benutzer \ brads_000 \ Dokumente \ GitHub \ ytn3rd \ monodroid-Bindungen \ JmDNS \ bindings \ obj \ Debug \ generiert \ src \ Javax.Jmdns.Impl.DNSCache.cs (95,95): Fehler CS0508: 'Javax.Jmdns.Impl.DNSCache.EntrySet()': Rückgabetyp muss 'System sein .Collections.ICollection 'zum Überschreiben des Elements ' Java.Util.AbstractMap.EntrySet()‘(CS0508) (JmDNS-Bindungen)

Was ich zu haben schien fixiert mit

System.Collections.ICollection

Auch wenn es, was es ist war schon wieder da.
public override global :: System.Collections.Generic.ICollection entrySet()

Wie auch immer, wäre jede Hilfe dankbar sein, um diese fantastische Bibliothek bis zu bekommen und läuft :)

+0

Welche Version von JmDNS und Xamarin verwenden Sie? – noobie

+0

Xamarin Studio 5 (Build 878). Xamarin.Android v4.12.4. jmdns v3.4.1. –

Antwort

2

Ich konnte es das Bindeprojekt korrekt erstellen. Um es korrekt zu erstellen, versuchen Sie bitte folgendes Vorgehen.

1. Erstellen Sie die JAR-Datei von der jmdns-3.4.1-Quelle neu. Machen Sie die DNSListener-Schnittstelle öffentlich. Entfernen Sie die Testpakete. Exportieren Sie dann die Quelle, um die aktualisierte JAR-Datei zu erhalten.

2. Aktualisieren Sie die in Schritt 1 erstellte JAR-Datei. Stellen Sie sicher, dass die Build-Aktion auf EmbededJar aktualisiert wird.

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 Ihre Beispielanwendung Sie haben noch eine Erlaubnis als android.permission.ACCESS_WIFI_STATE hinzuzufügen.

5. Auch alle Netzwerk-Operation sollte von einem Hintergrund-Thread durchgeführt werden und benachrichtigen UI im Haupt-Thread. Aktualisieren Sie daher Ihre MainActivity-Klasse entsprechend.

Hoffe, dies wird Ihnen helfen, den Build korrekt zu erstellen. Die Arbeitskopie des Beispielcodes wird hier hochgeladen https://github.com/Hitangshu/JmDNS_Xamarin_Library

+0

Ich war in der Lage, die jmdns Bindings zu bauen, aber als ich ging, um sie zu benutzen, bekam ich den folgenden Fehler. 'javax.jmdns.impl.DNSListener ist in javax.jmdns nicht öffentlich.impl; kann nicht von außerhalb des Pakets zugegriffen werden Ich habe meine Bindungen aktualisiert und Probe auf GitHub (Link in OP). Ich habe auch die Original-.jar und die modifizierte .jar, die ich von http://home.heeere.com/tech-androidjmdns.html heruntergeladen habe, die anscheinend benötigt wird, um JmDNS auf Android zu arbeiten. –

+1

@BradMoore Ich habe die Antwort aktualisiert. Auch der Link für eine Arbeitskopie Ihres Samples ist in der Antwort enthalten. Hoffe, das wird nützlich sein. – Paul

+0

Ich habe den Code und es kompiliert und lief. Spielt damit herum um sicherzustellen, dass es heute Abend funktioniert und dann als richtige Antwort markiert! So weit, ist es gut! Danke für die Hilfe –

1

Manchmal, wenn ich Schwierigkeiten bin vor Um einige Bibliotheken zu binden, erstelle ich einen Wrapper in Java und binde diese neue Bibliothek in Xamarin.

Ich tat das mit einem Unity Projekt, das nach Java exportiert wurde. Unity hat eine Bibliothek mit dem Namen UnityPlayer, mit ihm kann nicht (ich denke, es kann nicht) in binden Xamarin binden. Also habe ich eine andere Bibliothek in Java erstellt, mit der ich die Methoden aufrufen kann, die ich brauche, und mit bindbaren Rückgabetypen zurückkomme.

Sie müssen nur die Abhängigkeiten Bibliotheken an der richtigen Stelle platzieren. Aber Sie können LogCat Hilfe bekommen.

Ich hoffe, dass Sie damit einen gewissen Fortschritt erzielen können.

+0

Das ist eine großartige Idee! Ich werde sehen, wie ich heute Abend mit dem gehen werde :) –

+0

irgendwelche Beispiele, mit denen du mich vielleicht verlinken könntest, um loszulegen? –