Исключение Android: «java.lang.NoClassDefFoundError: javax.jmdns.JmDNS»

Надеюсь, моя проблема не слишком глупая, но у меня следующая проблема...

Я импортирую банку, содержащую библиотеку JmDNS, в свой проект. Мой проект настроен на обработку JmDNS следующим образом...

      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();
       }

где lock = android.net.wifi.WifiManager.MulticastLock lock; и PublicPeer peer;

Когда выполнение достигает peer = new PublicPeer("Aidan",6666,6667,this);, выводится следующая ошибка...

 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)

Если я правильно понимаю вышеизложенное, у него возникают проблемы с поиском моей библиотеки JmDNS, однако она добавляется. Я на 100% уверен в этом. Код JAR, который я импортирую, можно найти здесь: https://github.com/Ps2Fino/DSProject-Backend

ИЗМЕНИТЬ

Похоже, это проблема с добавлением JmDNS в Android, как описано здесь: http://home.heeere.com/tech-androidjmdns.html Я попытался следовать этому руководству для «повторной загрузки» JAR-файла JmDNS, но у меня все еще есть та же проблема. Похоже, с ним плохо получается.


person Aidanc    schedule 13.11.2011    source источник
comment
Я предполагаю, что вы добавили .jar в путь сборки в Eclipse?   -  person D-Dᴙum    schedule 13.11.2011
comment
Ваше понимание неверно. Найдите NoClassDefFoundError.   -  person Hot Licks    schedule 13.11.2011
comment
@Kerubu Да, я. JAR-файл, содержащий JAR-файл jmDNS, добавляется в путь к классу. Я также попытался создать JAR самостоятельно и добавить его в путь к классу с помощью jmDNS jar, и я попытался удалить jmDNS jar из добавляемого jar и вручную добавил его, но это выдает ошибку, утверждающую, что jar (jmDNS one ) добавляется дважды.   -  person Aidanc    schedule 13.11.2011
comment
@DanielRHicks Насколько я понимаю, он не может найти банку в пути к классу. Как это неправильно?   -  person Aidanc    schedule 13.11.2011
comment
NoClassDefFoundError не означает, что указанный файл .class не может быть найден. Это означает, что по какой-то причине класс не мог быть загружен после того, как файл .class был найден. Для материалов в готовых файлах jar это обычно происходит из-за отсутствия зависимости или конфликта версий между файлами jar.   -  person Hot Licks    schedule 13.11.2011
comment
@DanielRHicks Код работает нормально, если он не импортирован в Android, и я не вижу, где может возникнуть конфликт версий.   -  person Aidanc    schedule 13.11.2011
comment
Среди прочего Android использует различные поддерживающие банки. Так что достаточно места для несоответствия файлов jar. К сожалению, NoClassDefFoundError на самом деле следует называть ImNotGoingToGiveYouAClueWhatsWrongError, поскольку он не сообщает (по крайней мере, напрямую), какая проблема привела к ошибке. (Иногда при включенных определенных трассировках можно разобраться.)   -  person Hot Licks    schedule 13.11.2011
comment
(Одной из проблем может быть добавление jar к пути javax. Я не знаком с ограничениями, которые могут иметь Android, но обычная Java требует, чтобы некоторые пути (не помню, является ли javax одним) загружались только как часть путь загрузочного класса.)   -  person Hot Licks    schedule 13.11.2011


Ответы (3)


Я думаю, что у разработчиков JmDNS могут быть некоторые проблемы с публикацией/поддержкой их выпуска, и, что еще хуже, плохо документировано, вы можете скачать jar с обоих домашняя страница SourceForge и центральный репозиторий Maven, однако , вы можете видеть, что файл jar для одного и того же выпуска (последняя версия 3.4.1) отличается, файл из центрального репозитория Maven более чистый, вероятно, это то, о чем Heeere говорил на своей странице о rejaring. Я всегда использую Maven для создания своего приложения для Android и поэтому никогда не пробовал приложение SourceForge, однако файл jar, загруженный из Maven, работает для меня.

person yorkw    schedule 15.11.2011
comment
Только что попробовал это, и кажется, что это работает, когда оно само по себе, но не с библиотекой, которую я реализую... хм... интересно... - person Aidanc; 16.11.2011
comment
В чем ошибка? Я также использую его в своем библиотечном проекте и не испытываю никаких проблем. - person yorkw; 17.11.2011
comment
@Aidanc, дайте шанс единственной цели maven-assembly-plugin ... чтобы вы могли быть еще более уверены, что каждый класс находится в пути к классам (поскольку у вас есть только один файл jar) - person Ustaman Sangat; 22.11.2011

Это может происходить, поскольку класс еще не загружен. Класс clazz = getClassLoader().loadClass("javax.jmdns.JmDNS"); Затем используйте отражение для создания экземпляра объекта типа clazz.

person Rajdeep Dua    schedule 13.11.2011

Один из способов, которым вы можете обойти добавление файла jar, — это взять исходный код из файла JmDNS.jar и добавить его непосредственно в свой проект. У меня была проблема, похожая на вашу, когда я не мог заставить свое Android-приложение правильно работать с файлом JmDNS.jar из SourceForge или Maven. Я просто взял все исходные файлы из файла jar, добавил их в свой проект Eclipse, построил его, и он работает как шарм.

Я не знаю, будет ли это долгосрочное решение, которое вы хотели бы использовать, но это решение сработало для меня.

person anthonylawson    schedule 02.04.2012