Home » Android » dependency management – Android build with jmDNS fails

dependency management – Android build with jmDNS fails

Posted by: admin June 15, 2020 Leave a comment

Questions:

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.

How to&Answers:

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.

Answer:

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.