PREAMBLE: seit SDK-Stufe 16, Android verfügt über eine integrierte Zeroconf-Implementierung. Sofern keine Kompatibilität mit Bronzezeitaltern erforderlich ist, verwenden Sie jmDNS nicht mehr, verwenden Sie stattdessen NsdManager
.Android Build mit jmDNS schlägt fehl
PREAMBLE # 2: frühe Versionen von NsdManager sind voll von Pannen, siehe SO getSystemService(Context.NSD_SERVICE) freezes the 5.0 emulator und die verknüpften Fehler Aufzeichnungen hinterfragen.
Ich habe jmDNS 3.4.1 zu meinem Android-Projekt hinzugefügt. Kopierte die JAR unter lib
, dann unter "Java BuildPath"/Bibliotheken eine Referenz hinzugefügt.
Nun meine Build schlägt mit der folgenden Meldung in Console:
[2012-07-27 22:59:07 - Yarxi] Dx
UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.IllegalArgumentException: already added: Lcom/strangeberry/jmdns/tools/Browser$1;
at
com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:123)
at com.android.dx.dex.file.DexFile.add(DexFile.java:163)
at com.android.dx.command.dexer.Main.processClass(Main.java:486)
at com.android.dx.command.dexer.Main.processFileBytes(Main.java:455)
at com.android.dx.command.dexer.Main.access$400(Main.java:67)
at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:394)
at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:245)
at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:131)
at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:109)
at com.android.dx.command.dexer.Main.processOne(Main.java:418)
at com.android.dx.command.dexer.Main.processAllFiles(Main.java:329)
at com.android.dx.command.dexer.Main.run(Main.java:206)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.android.ide.eclipse.adt.internal.build.DexWrapper.run(DexWrapper.java:180)
at com.android.ide.eclipse.adt.internal.build.BuildHelper.executeDx(BuildHelper.java:703)
at com.android.ide.eclipse.adt.internal.build.builders.PostCompilerBuilder.build(PostCompilerBuilder.java:577)
at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:728)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:199)
at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:321)
at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:396)
at org.eclipse.core.internal.resources.Project$1.run(Project.java:618)
at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2344)
at org.eclipse.core.internal.resources.Project.internalBuild(Project.java:597)
at org.eclipse.core.internal.resources.Project.build(Project.java:124)
at com.android.ide.eclipse.adt.internal.project.ProjectHelper.doFullIncrementalDebugBuild(ProjectHelper.java:1000)
at com.android.ide.eclipse.adt.internal.launch.LaunchConfigDelegate.launch(LaunchConfigDelegate.java:147)
at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:854)
at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:703)
at org.eclipse.debug.internal.ui.DebugUIPlugin.buildAndLaunch(DebugUIPlugin.java:937)
at org.eclipse.debug.internal.ui.DebugUIPlugin$8.run(DebugUIPlugin.java:1141)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)
[2012-07-27 22:59:10 - Yarxi] Dx 1 error; aborting
[2012-07-27 22:59:10 - Yarxi] Conversion to Dalvik format failed with error 1
Und wenn ich an den JAR-Inhalten im Paket-Explorer unter referenzierten Bibliotheken suchen, ich sehe, dass jede Klasse unter jedem Paket in dem jmdns. jar wird zweimal aufgeführt. Zwei Kopien von JmDNS.class, zwei Kopien von JmmDNS.class und so weiter.
Irgendwelche Ideen, was ist los mit dem Glas? Ich benutze andere Gläser im Projekt, keiner von ihnen verhält sich so. Versuchte Reinigung einige Male, entfernt und wieder hinzugefügt die JAR - der gleiche Effekt.
Vielleicht ist es erwähnenswert, dass dies ein Bibliotheksprojekt ist, und der Fehler erscheint, wenn ich die App, die auf die Bibliothek verweist, aufbaut.
Vielen Dank für die Präambel. Ich habe auch begonnen, NsdManager zu verwenden und hatte positive Erfahrung. Ich habe mich gefragt, ob NsdManager JmDNS vollständig ersetzen kann. – Hong
NsdManager hat seine eigenen Probleme: http://stackoverflow.com/questions/27281340/getsystemservicecontext-nsd-service-freezes-the-5-0-emulator –
Ich hatte zunächst ein Problem, wie ich dort kommentiert, aber es scheint zu sein stabil jetzt. Kann NsdManager JmDNS in Bezug auf Funktionalität ersetzen? Ich habe JmDNS sehr kurz benutzt und dann zu NsdManager gewechselt, JmDNS scheint eine Menge Funktionen zu haben. – Hong