2014-05-23 29 views
7

Ho iniziato a lavorare su un binding JmDNS per Xamarin.Android. Sono riuscito a ottenere il binding per costruire ma non posso fare riferimento dal mio codice. https://github.com/ytn3rd/monodroid-bindings/tree/master/JmDNSXamarin.Android Problemi di binding JmDNS

Il primo problema era che non esisteva alcuna classe IDNSListener a cui fare riferimento. Quindi ho aggiunto un'interfaccia parziale per questo. Ho la funzione di cui ha bisogno void updateRecord (DNSCache dnsCache, long now, DNSEntry record); ha commentato come si lamenterebbe di non essere in grado di fare riferimento a DNSCache o DNSEntry. (Credo di aver rimosso DNSCache e questo è il motivo)

Non sono sicuro che alcune delle cose che ho fatto fossero cattive, basta rimuovere i nodi per farlo compilare. Per instnace. Ho aggiunto questo per rimuovere i seguenti errori.

E: \ Users \ brads_000 \ Documenti \ GitHub \ ytn3rd \ MonoDroid-binding \ JmDNS \ attacchi \ obj \ Debug \ generato \ src \ Javax.Jmdns.Impl.JmDNSImpl.cs (24,24): Errore CS0738: 'Javax.Jmdns.Impl.JmDNSImpl.SubTypeEntry' non implementa il membro dell'interfaccia 'Java.Util.IMapEntry.Key'. 'Javax.Jmdns.Impl.JmDNSImpl.SubTypeEntry.Key' non può implementare 'Java.Util.IMapEntry.Key' perché non ha il tipo di ritorno corrispondente di '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): Errore CS0738: 'Javax.Jmdns.Impl.JmDNSImpl.SubTypeEntry' non membro dell'interfaccia implementazione 'Java.Util.IMapEntry.Value'. 'Javax.Jmdns.Impl.JmDNSImpl.SubTypeEntry.Value' non può implementare 'Java.Util.IMapEntry.Value' perché non ha il tipo di ritorno corrispondente di 'Java.Lang.Object'. (CS0738) (JmDNS-Bindings)

Il problema proviene dalla classe Java.Util.IMapEntry. Ho pensato che l'azione corretta sarebbe stata quella di creare il mio Parital SubEntryType e quindi sovrascrivere la proprietà Key string, ma non lo avrebbe rilevato. Il mio prossimo tentativo era di fare questo.

java.lang.Object

Il che risolvere tale errore, ma sarebbe poi causare un errore con

E: \ Users \ brads_000 \ Documenti \ GitHub \ ytn3rd \ MonoDroid -bindings \ JmDNS \ bindings \ obj \ Debug \ generated \ src \ Javax.Jmdns.Impl.JmDNSImpl.cs (12,12): Errore CS1502: La migliore corrispondenza di metodo sovraccaricata per 'Android.Runtime.JNIEnv.NewString (string) 'ha alcuni argomenti non validi (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()); 
     } 
    } 
} 

Ma ancora una volta, non vuole scegliere questo nuovo metodo in su.

ho tolto javax.jmdns.impl.DNSCache a causa di stessi errori con chiave/valore come sopra e,

E: \ Users \ brads_000 \ Documenti \ GitHub \ ytn3rd \ MonoDroid-binding \ JmDNS \ bindings \ obj \ Debug \ generated \ src \ Javax.Jmdns.Impl.DNSCache.cs (95,95): Errore CS0508: 'Javax.Jmdns.Impl.DNSCache.EntrySet()': il tipo restituito deve be 'System .Collections.ICollection 'per far corrispondere il membro sottoposto a override ' Java.Util.AbstractMap.EntrySet()'(CS0508) (JmDNS-Associazioni)

che mi sembrava di avere fissato con

System.Collections.ICollection

Anche se è quello che Stava già tornando.
public override globale :: System.Collections.Generic.ICollection entrySet()

In ogni caso, qualsiasi aiuto sarebbe apprezzato per ottenere questa libreria impressionante attivo e funzionante :)

+0

Quale versione di JmDNS e Xamarin stai utilizzando? – noobie

+0

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

risposta

2

Sono riuscito a creare correttamente il progetto vincolante. Per costruirlo correttamente, prova con il seguente approccio.

1.Rappresenta il file jar dall'origine jmdns-3.4.1. Rendi pubblica l'interfaccia DNSListener. Rimuovere i pacchetti di test. Quindi esportare l'origine per ottenere il file jar aggiornato.

2.Aggiornare il file jar creato dal passaggio 1. Assicurarsi di aggiornare l'azione di compilazione su 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 vostro campione app è necessario aggiungere un altro permesso di android.permission.ACCESS_WIFI_STATE.

5. Anche tutte le operazioni di rete devono essere eseguite da un thread in background e devono essere notificate all'interfaccia utente in thread principale. Quindi aggiorna la tua classe MainActivity di conseguenza.

Spero che questo ti aiuti a creare correttamente la build. La copia di lavoro del codice di esempio viene caricata qui https://github.com/Hitangshu/JmDNS_Xamarin_Library

+0

Sono stato in grado di creare i collegamenti jmdns, ma quando sono andato a usarli ho ricevuto il seguente errore. 'javax.jmdns.impl.DNSListener non è pubblico in javax.jmdns.impl; non è possibile accedere dal pacchetto esterno Ho aggiornato i miei collegamenti e l'esempio su github (link in OP). Ho anche incluso il .jar originale e il .jar modificato che ho scaricato da http://home.heeere.com/tech-androidjmdns.html che è apparentemente necessario per far funzionare JmDNS su Android. –

+1

@BradMoore Ho aggiornato la risposta. Anche il link per una copia di lavoro del tuo campione è incluso nella risposta. Spero che questo sia utile. – Paul

+0

Ottenuto il codice e compilato ed eseguito. Ci giocheremo per assicurarci che funzionino stasera, quindi segna come risposta corretta! Fin qui tutto bene! Grazie per l'aiuto –

1

A volte, quando sto in difficoltà per legare alcune librerie, creo un wrapper in java e lego la nuova libreria in Xamarin.

L'ho fatto con un progetto Unity esportato in Java. Unity ha una libreria denominata UnityPlayer, con essa non può (penso che non sia possibile) essere vincolante in Xamarin. Così ho creato un'altra libreria in java con può chiamare i metodi di cui ho bisogno, e restituisce con tipi di resi associabili.

Devi solo posizionare le librerie delle dipendenze nel posto giusto. Ma puoi ottenere LogCat per ottenere aiuto.

Spero che tu possa ottenere qualche progresso in questo.

+0

Questa è una grande idea! Vedrò come andrò più tardi stasera :) –

+0

qualche esempio con cui potresti collegarmi per iniziare? –

Problemi correlati