Android build with jmDNS fails
Asked Answered
S

2

8

PREAMBLE: since SDK level 16, Android has a built-in Zeroconf implementation. Unless bronze age compatibility is a concern, don't use jmDNS anymore, use NsdManager instead.


PREAMBLE #2: early versions of NsdManager are full of glitches, see SO question getSystemService(Context.NSD_SERVICE) freezes the 5.0 emulator and the linked bug records.


I've added jmDNS 3.4.1 to my Android project. Copied the JAR under lib, then under "Java BuildPath"/Libraries added a reference.

Now my build fails with the following message 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

And when I look at the JAR contents in the Package Explorer under Referenced Libraries, I see that every class under every package in the jmdns.jar is listed twice. Two copies of JmDNS.class, two copies of JmmDNS.class, and so forth.

Any ideas what's wrong with the jar? I'm using other jars in the project, none of them act this way. Tried cleaning a few times, removed and re-added the JAR - same effect.

Might be worth noting that this is a library project, and the error pops up when I build the app that refers to the library.

Shakedown answered 28/7, 2012 at 3:20 Comment(6)
Thank you for the PREAMBLE. I also have started using NsdManager and had positive experience. I have been wondering if NsdManager can completely replace JmDNS.Kesha
NsdManager has its own problems: #27281840Shakedown
I initially had some issue as I commented there, but it seems to be stable now. Can NsdManager replace JmDNS in terms of functionality? I used JmDNS very briefly, then switched to NsdManager, JmDNS seems to have a lot of functions.Kesha
Service advertisement and discovery is supported, what else do you need?Shakedown
I am all set for now. I am just curious whether JmDNS can do more.Kesha
Don't know, look it up. I only needed the two basics for my own project.Shakedown
G
15

You Probably used the .jar from SourceForge. That version has all .class files twice in the .jar and this leads to your error.

Try using the .jar from Maven http://search.maven.org/#browse|1991004139, this should work, I used it earlier this month.

Gains answered 30/7, 2012 at 16:58 Comment(0)
L
4

See if the answer here helps.

Generally speaking, jar file from SourceForge Home Page is malformed and does not work with Android, try using the one from Maven Central Repository, or the dirty workaround mentioned in this blog post.

Luganda answered 29/7, 2012 at 4:0 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.