Android Exception: 'java.lang.NoClassDefFoundError: javax.jmdns.JmDNS'
Asked Answered
N

3

3

Hopefully my issue isn't too silly but I'm having the following problem...

I'm importing a jar which contains the library JmDNS into my project. My project sets up to handle JmDNS like this...

      setUp();
        try {
            peer = new PublicPeer("Aidan",6666,6667,this);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

     private void setUp(){
        android.net.wifi.WifiManager wifi =
               (android.net.wifi.WifiManager)
                  getSystemService(android.content.Context.WIFI_SERVICE);
        lock = wifi.createMulticastLock("Lock");
            lock.setReferenceCounted(true);
            lock.acquire();
       }

where lock = android.net.wifi.WifiManager.MulticastLock lock; and PublicPeer peer;

When execution reaches peer = new PublicPeer("Aidan",6666,6667,this); the following error outputs...

 11-13 13:12:47.644: W/dalvikvm(204): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
 11-13 13:12:47.644: E/AndroidRuntime(204): Uncaught handler: thread main exiting due to uncaught exception
 11-13 13:12:47.664: E/AndroidRuntime(204): java.lang.NoClassDefFoundError: javax.jmdns.JmDNS
 11-13 13:12:47.664: E/AndroidRuntime(204):     at com.daniel.business.publicchat.PeerAdvertiser.<init>(PeerAdvertiser.java:36)
 11-13 13:12:47.664: E/AndroidRuntime(204):     at com.daniel.business.publicchat.PublicPeer.<init>(PublicPeer.java:60)
 11-13 13:12:47.664: E/AndroidRuntime(204):     at com.chatr.org.PublicChat.onCreate(PublicChat.java:21)
 11-13 13:12:47.664: E/AndroidRuntime(204):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
 11-13 13:12:47.664: E/AndroidRuntime(204):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
 11-13 13:12:47.664: E/AndroidRuntime(204):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
 11-13 13:12:47.664: E/AndroidRuntime(204):     at android.app.ActivityThread.access$2200(ActivityThread.java:119)
 11-13 13:12:47.664: E/AndroidRuntime(204):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
 11-13 13:12:47.664: E/AndroidRuntime(204):     at android.os.Handler.dispatchMessage(Handler.java:99)
 11-13 13:12:47.664: E/AndroidRuntime(204):     at android.os.Looper.loop(Looper.java:123)
 11-13 13:12:47.664: E/AndroidRuntime(204):     at android.app.ActivityThread.main(ActivityThread.java:4363)
 11-13 13:12:47.664: E/AndroidRuntime(204):     at java.lang.reflect.Method.invokeNative(Native Method)
 11-13 13:12:47.664: E/AndroidRuntime(204):     at java.lang.reflect.Method.invoke(Method.java:521)
 11-13 13:12:47.664: E/AndroidRuntime(204):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
 11-13 13:12:47.664: E/AndroidRuntime(204):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
 11-13 13:12:47.664: E/AndroidRuntime(204):     at dalvik.system.NativeStart.main(Native Method)

If my understanding of the above is correct it's having problems located my JmDNS library however, it is being added. I'm 100% sure of it. The code of the JAR which I am importing can be found here: https://github.com/Ps2Fino/DSProject-Backend

EDIT

It appears to be an issue with JmDNS being added to Android as documented here: http://home.heeere.com/tech-androidjmdns.html I've attempted following that guide for "re-jaring" the JmDNS JAR file but I'm still having the same issue. It doesn't appear to be working well with it.

Newel answered 13/11, 2011 at 13:23 Comment(8)
I assume you'be added the .jar to the build path in Eclipse?Joacimah
Your understanding is incorrect. Search for "NoClassDefFoundError".Mainmast
@Kerubu Yes I am. The jar which contains the jmDNS jar is being added to the class path. I've also attempt making the JAR myself and adding that to the class path with the jmDNS jar and I've tried removing the jmDNS jar from the jar being added and manually added it but that throws an error claiming that the jar (jmDNS one) is being added twice.Newel
@DanielRHicks My understanding is that it cannot locate the jar in the class path. How is that incorrect?Newel
NoClassDefFoundError does not mean that the named .class file could not be found. It means that, for some reason, the class could not be "loaded" after the .class file was found. For stuff in "canned" jar files this is usually because a dependency is missing or there is a version conflict between jar files.Mainmast
@DanielRHicks The code runs fine when it's not imported into Android and I can't see where there would be a version conflict.Newel
Android uses different supporting jars, among other things. So plenty of room for jar file mismatch. Unfortunately, NoClassDefFoundError really ought to be called "ImNotGoingToGiveYouAClueWhatsWrongError", since it doesn't (at least directly) tell you what problem led up to the error. (Sometimes, with certain traces turned on, you can figure it out.)Mainmast
(One problem might be adding a jar to the javax path. I'm not familiar with the restrictions that Android may have, but regular Java requires that some paths (don't recall if javax is one) only be loaded as a part of the "boot class path".)Mainmast
M
3

I think JmDNS developers may have some issues regarding to publish/maintain their release and what even worse is poor documented, you can download jar from both SourceForge home page and Maven central repo, however, you can see that the jar file for the same release (latest version is 3.4.1) are different, the one from Maven central repository is more clean, probably this is what Heeere talked in his page about rejaring. I always use Maven build my Android application and so never tried the one from SourceForge, however, jar file downloaded from Maven works for me.

Meteorology answered 15/11, 2011 at 20:15 Comment(3)
Just tried this and it appears that it DOES work when on it's own but not with the library I'm implementing.. hm.. interesting..Newel
What is the error? I also use it in my library project and haven't got any problem.Meteorology
@Aidanc, give maven-assembly-plugin's "single" goal a shot.. so that you can be even surer that every class is in the classpath (since you have only one jar file)Despicable
P
1

This might be happening as the class is not loaded yet. Class clazz = getClassLoader().loadClass("javax.jmdns.JmDNS"); Then use reflection to create instance of object of type clazz

Planometer answered 13/11, 2011 at 13:29 Comment(0)
U
0

One way that you could go around adding the jar file would be to take the source code from the JmDNS.jar file and add it directly to your project. I was having a issue similar to yours where I could not get my Android application to properly work with the JmDNS.jar file from SourceForge or Maven. I just took all of the source files from jar file, added them to my Eclipse project, built it, and it works like a charm.

I don't know if this would be a long term solution that you would want to use, but this solution worked for me.

Uniparous answered 2/4, 2012 at 19:51 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.