NoClassDefFoundError для кода в библиотеке Java на Android - PullRequest
75 голосов
/ 30 декабря 2011

Я часто сталкиваюсь с ошибкой среди моих пользователей.Приложение вылетает при запуске.Когда предполагается, что MainActivity загружена, виртуальная машина не может найти класс.Я не могу понять, почему.Архитектура приложения такова, что существует общий проект, который используют и моя бесплатная, и профессиональная версия.Не знаю, актуально ли это.Смотрите трассировку стека ниже.Есть мысли?

java.lang.NoClassDefFoundError: com.android.common.MainActivity
at com.mycompany.myapp.Splash.onCreate(Splash.java:23)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
at android.app.ActivityThread.access$1500(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: com.android.common.MainActivity in loader     dalvik.system.PathClassLoader[/system/framework/com.google.android.maps.jar:/data/app/com.android.pro-1.apk]

Редактировать: Спасибо за комментарий ниже, Ричард.Теперь я изменил com.android.Splash на что-то другое.Во всяком случае, это было не настоящее имя класса.Мой плохой ...!

Ответы [ 24 ]

125 голосов
/ 03 октября 2012

У меня была та же проблема, я сделал следующее, чтобы решить проблему.

  1. Перейдите в «Свойства» проекта.
  2. Выберите «Путь сборки Java»
  3. Выберите вкладку «Порядок и экспорт»
  4. Здесь вы увидите пути и зависимости выбранного проекта «src» и «gen».
  5. Порядок, в котором они были перечислены первыми »src"а затем путь" gen "
  6. Я переключаю их так, чтобы папка" gen "создавалась до" src "

gen - автоматический код впроект (из зависимостей и ссылок) src - исходный код в проекте

Не было необходимости перезапускать Eclipse.Это только начало работать.

Честно говоря, я никогда не пробовал "Инструменты Android> Исправить свойства проекта", иногда это может быть одно и то же.Я не знаю, я только что сделал выше, увидев сообщение об ошибке, думая, что что-то не так с путями сборки.


Редактировать


Позжеэтого было недостаточно, я снова получал ошибку.Затем я «проверил» все зависимости, перечисленные в этом представлении.Теперь это работает снова.Все идет нормально.Я буду держать это в курсе, если он снова не удастся.

К вашему сведению : в моей последней попытке я попробовал «Инструменты Android> Исправить свойства проекта», но у меня ничего не вышло.

18 голосов
/ 30 октября 2012

В настоящее время я использую SDK 20.0.3, и ни одно из предыдущих решений не помогло мне.

Мне удалось заставить вещи работать

  • Правой кнопкой мыши щелкнув проект Android
  • Затем выберите «Путь сборки» -> «Источник ссылки», чтобы открыть диалоговое окно «Источник ссылки»..
  • Затем я указал папку 'src' проекта Java и дал ей имя, отличное от значения по умолчанию 'src' (например, 'src2').
  • Теперь вы можете прямощелкните -> удалить новую папку 'src2'.

Это привело к созданию созданных файлов классов Java, которые были скомпилированы для виртуальной машины Dalvik вместо виртуальной машины Java при создании проекта Android.Это позволило файлам классов Java в jar-файле библиотеки Android пройти дексинг при создании проекта Android .apk.Теперь, когда приложение было запущено, вместо проекта Java.lang.NoClassDefFoundError были найдены классы проекта Java.

Если вы хотите использовать файл JAR вместо ссылки на источник, вам нужно будет создатьБиблиотека Android проекта.(Проект Android с опцией «is library» отмечен в меню «Свойства -> Android».) Затем вам нужно будет либо связать источник проекта Java с проектом библиотеки Android, как описано выше, либо скопировать исходные файлы из папки «src» впроект Java в папку 'src' проекта библиотеки Android.Создайте проект библиотеки Android.Затем вы сможете скопировать файл jar проекта Android, созданный в папку «libs» папки Android, поскольку файлы классов в ней были скомпилированы для виртуальной машины Davlik вместо виртуальной машины Java при создании проекта Android.Это позволяет файлам классов Java в jar-файле библиотеки Android проходить через деккс при создании проекта Android .apk.Теперь при запуске приложения вместо проекта Java.lang.NoClassDefFoundError будут найдены классы проекта Java.

17 голосов
/ 21 июня 2013

Попробуйте перейти в Project -> Properties -> Java Build Path -> Order & Export и убедитесь, что частные библиотеки Android проверены для вашего проекта и для всех других используемых вами библиотечных проектов. Я получил решение, перейдя по ссылке ниже NoClassDefFoundError Android Project ?

8 голосов
/ 28 марта 2013

На всякий случай, если кому-то это поможет, я столкнулся с той же проблемой. Мой файл jar находился в каталоге libs, и файл jar был добавлен в путь сборки. Тем не менее это было исключение.

Я только что очистил проект, и он сработал для меня.

Eclipse -> Проект -> Очистить -> Выбрать проект и очистить

7 голосов
/ 04 июля 2013

Я испробовал все вышеперечисленные решения, но у меня ничего не вышло, вот что я сделал, чтобы сделать это: проект-> путь компоновки конфигурации-> порядок и экспорт-> переместить зависимый проект поверх

6 голосов
/ 14 августа 2012

Эта ошибка также возникает, когда вы создаете приложение, которое использует API Google (например, Карты), но запускаете его на устройстве, которое предназначено для API Android.

5 голосов
/ 21 апреля 2013

Я столкнулся с этой NoClassDefFoundError, когда использовал java.nio.charset.StandardCharsets.

Причина в том, что StandardCharsets не существовало до JRE 1.7.Если я установлю версию компиляции Java на 1.7, Eclipse пожаловался, что «Android требует уровня соответствия компилятора 5.0 или 6.0».Итак, я исправил это, щелкнув правой кнопкой мыши имя проекта-> Инструменты Android-> Исправить свойства проекта.Он скомпилирован с JRE1.6.

Однако, поскольку StandardCharsets не существовало до 1.7.Он сообщил об NoClassDefFoundError, когда я его запустил.

Я не осознавал этого, пока не попробовал множество других методов, включая переустановку JDK.Истинная причина ясно объясняется значением NoClassDefFoundError: класс не может быть найден во время выполнения, хотя он прошел компиляцию.

Общий вывод заключается в том, что до тех пор, пока Android не работает с JRE 1.7, если вы используете любую новую функцию, предоставленную начиная с 1.7, вы столкнетесь с этой ошибкой.

Мое решение состоит в том, что я скопировал этиИсходный код в мой код!

4 голосов
/ 30 декабря 2011

Описание NoClassDefFoundError из тега SO:

Ошибка Java, возникающая, если виртуальная машина Java или экземпляр ClassLoader пытается загрузить определение класса (как часть обычноговызов метода или как часть создания нового экземпляра с использованием нового выражения), а определение класса не найдено.Определение класса для поиска существовало, когда выполняемый в данный момент класс был скомпилирован, но определение больше не может быть найдено.

Или лучше:

NoClassDefFoundError в Java возникает, когдаВиртуальная машина Java не может найти определенный класс во время выполнения, который был доступен во время компиляции.

с этой страницы.Проверьте это, есть несколько способов исправить ошибку.Надеюсь, это поможет.

3 голосов
/ 27 ноября 2012

Для меня эта проблема была связана с тем, что используемый мной API не был развернут.Например, я использовал ZSDK_API.jar в качестве ссылки.

Чтобы исправить проблему, мне пришлось щелкнуть правой кнопкой мыши по проекту и выбрать свойства.Из JAVA BUILD PATH мне пришлось добавить API, который не был развернут.Это было странно, поскольку приложение выбрасывало класс MainActivity, который не был найден, и на самом деле ошибка была вызвана тем, что класс DiscoveryHandler не был найден.

Надеется, что это кому-то поможет.

3 голосов
/ 26 октября 2013

В моем случае я пытался добавить нормальный класс Java (из обычного проекта Java), скомпилированный с jre 1.7, в проект приложения для Android, скомпилированный с jre 1.7.

Решением было перекомпилировать этот обычный java-класс с jre 1.6 и добавить ссылки на проект приложения для Android (также скомпилированный с jre 1.6) как обычно (в порядке табуляции и экспорта обязательно проверьте класс, проект и т. Д.).

Тот же процесс при использовании библиотеки Android для ссылки на внешние обычные классы Java.

Не знаю, что не так с jre 1.7, при компиляции обычных java-классов из обычного java-проекта и пытайтесь ссылаться на них в проектах приложений для Android или библиотек Android.

Если вы не используете обычные Java-классы (из обычного Java-проекта), вам не нужно переходить на jre 1.6.

...