2014-05-23 10 views
7

Xamarin.Android 용 JmDNS 바인딩 작업을 시작했습니다. 바인딩을 가져올 수 있었지만 코드에서 참조 할 수는 없습니다. https://github.com/ytn3rd/monodroid-bindings/tree/master/JmDNSXamarin.Android JmDNS 바인딩 문제

첫 번째 문제는 참조 할 IDNSListener 클래스가 없다는 것입니다. 그래서 거기에 부분 인터페이스를 추가했습니다. 나는 그것이 필요한 기능을 가지고있다 updateRecord (DNSCache dnsCache, 지금은 DNSEntry 레코드); DNSCache 또는 DNSEntry를 참조 할 수 없다는 불만을 토로하고 댓글을 달았습니다. (DNSCache를 제거한 이유는 무엇입니까?)

내가 수행 한 작업 중 일부가 잘못되었거나 노드를 제거하여 컴파일하려고하는지 확실하지 않습니다. instnace. 다음 오류로 제거하려면이 항목을 추가했습니다.

E : \ 사용자 \ brads_000 문서 GitHub의를 \ \ \ ytn3rd \ monodroid - 바인딩을 \ JmDNS 바인딩 \ \ OBJ \ 디버그 \ 생성 \ SRC \ Javax.Jmdns.Impl.JmDNSImpl.cs (24, 24) 오류 CS0738 : 'Javax.Jmdns.Impl.JmDNSImpl.SubTypeEntry'가 인터페이스 멤버 'Java.Util.IMapEntry.Key'를 구현하지 않습니다. 일치하는 반환 유형이 'Java.Lang.Object'가 아니기 때문에 'Javax.Jmdns.Impl.JmDNsmpl.SubTypeEntry.Key'는 'Java.Util.IMapEntry.Key'를 구현할 수 없습니다. (CS0738) 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'를 구현하지 않습니다. 일치하는 반환 유형이 'Java.Lang.Object'가 아니기 때문에 'Javax.Jmdns.Impl.JmDNSImpl.SubTypeEntry.Value'는 'Java.Util.IMapEntry.Value'를 구현할 수 없습니다. (CS0738) (JmDNS-Bindings)

Java.Util.IMapEntry 클래스의 문제입니다. 올바른 동작은 내 자신의 parital SubEntryType을 만든 다음 문자열 Key 속성을 재정의하는 것이지만 그것을 선택하지 않을 것이라고 생각했습니다. 나의 다음 시도는 이것을하는 것이었다.

java.lang.Object 상위

해당 오류를 해결하는 것입니다,하지만

E에 오류 원인이

: \ 사용자 \ brads_000 문서 GitHub의를 \ \ \ ytn3rd \ monodroid (12,12) : 오류 CS1502 : 에 대한 최상의 오버로드 된 메서드 일치 'Android.Runtime.JNIEnv.NewString (문자열) '에 잘못된 인수가 있습니다. (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()); 
     } 
    } 
} 

그러나 다시는,이 새로운 방법을 위로 선택하지 않습니다.

내가 때문에 위와 같은 키/값과 같은 오류를

E javax.jmdns.impl.DNSCache을 제거 : \ 사용자 \ brads_000 문서 GitHub의 \ ytn3rd \ monodroid - 바인딩을 \ \ \ JmDNS \ bindings \ obj \ Debug \ generated \ src \ Javax.Jmdns.Impl.DNSCache.cs (95,95) : 오류 CS0508 : 'Javax.Jmdns.Impl.DNSCache.EntrySet()': 반환 유형은 이어야합니다. '시스템 .Collections.ICollection '은 재정의 된 멤버 과 일치합니다.'Java.Util.AbstractMap.EntrySet() '(CS0508) (JmDNS - 바인딩)

나는 듯이 무엇을 비록

System.Collections.ICollection

고정 가지고 벌써 돌아왔다.
공공 재정의 세계 :: System.Collections.Generic.ICollection EntrySet()

어쨌든, 어떤 도움 내가 어려움을 겪고있을 때,이 멋진 도서관을 위로하고 때때로 :

+0

사용중인 JmDNS 및 Xamarin 버전은 무엇입니까? – noobie

+0

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

답변

2

바인딩 프로젝트를 올바르게 빌드 할 수있었습니다. 올바르게 구축하려면 다음 방법을 시도해보십시오.

1. jmdns-3.4.1 소스에서 jar 파일을 다시 작성하십시오. DNSListener 인터페이스를 public으로 설정합니다. 테스트 패키지를 제거하십시오. 그런 다음 소스를 내보내 업데이트 된 jar 파일을 가져옵니다.

2. 1 단계에서 만든 jar 파일을 업데이트하십시오. 빌드 작업을 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 샘플 응용 프로그램이 android.permission.ACCESS_WIFI_STATE으로 또 하나의 권한을 추가해야합니다.

5. 모든 네트워크 작업은 백그라운드 스레드에서 수행하고 메인 스레드의 UI에 통지해야합니다. MainActivity 클래스를 적절히 업데이트하십시오.

희망이 있으면 빌드를 올바르게 작성하는 데 도움이됩니다. 샘플 코드의 작업 사본이 여기에 업로드됩니다. https://github.com/Hitangshu/JmDNS_Xamarin_Library

+0

jmdns 바인딩을 만들 수 있었지만 사용할 때 다음 오류가 발생했습니다. 'javax.jmdns.impl.DNSListener는 javax.jmdns에서 public이 아닙니다.impl; 외부 패키지에서 액세스 할 수 없습니다. ' github에서 내 바인딩 및 샘플을 업데이트했습니다 (OP의 링크). 나는 JmDNS를 Android에서 작동시키는 데 필요한 http://home.heeere.com/tech-androidjmdns.html에서 다운로드 한 원본 .jar 및 수정 된 .jar도 포함 시켰습니다. –

+1

@BradMoore 답변을 업데이트했습니다. 또한 샘플에 대한 작업 사본 링크가 응답에 포함됩니다. 희망이 유용 할 것입니다. – Paul

+0

코드를 가져 와서 컴파일하고 실행했습니다. 그것이 기능적인 오늘 밤을 보장하기 위해 그 다음에 정답으로 표시 할 것입니다! 여태까지는 그런대로 잘됐다! 도움을 주셔서 감사합니다 –

1

실행을 얻을 주시면 감사하겠습니다 일부 라이브러리를 바인딩하려면 자바에서 래퍼를 만들고 해당 라이브러리를 Xamarin에 바인딩하십시오.

나는 Unity 프로젝트를 Java로 내 보낸 경우이를 수행했습니다. Unity에는 UnityPlayer이라는 라이브러리가 있습니다.이 라이브러리는 Xamarin에 바인딩 할 수 없습니다. 그래서 자바에서 다른 라이브러리를 만들어서 필요한 메소드를 호출하고 바인드 가능한 리턴 유형으로 리턴합니다.

올바른 위치에 종속 라이브러리를 배치하면됩니다. 그러나 도움을 얻으려면 LogCat 수 있습니다.

나는 그와 함께 몇 가지 진전을 가져올 수 있기를 바랍니다.

+0

그게 좋은 생각입니다! 나는 내가 어떻게 오늘 밤에 나중에 그걸 보게 될지 알게된다. –

+0

당신이 나를 시작하기 위해 나를 연결할 수있는 어떤 예가 있겠는가? –