NoClassDefFoundError для кода в библиотеке Java на Android

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

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 на что-то еще. В любом случае это не было истинное имя класса. Виноват…!

Solutions Collecting From Web of "NoClassDefFoundError для кода в библиотеке Java на Android"

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

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

Gen – автоматизированный код в проекте (из зависимостей и ссылок)
Src – исходный код в проекте

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

Честно говоря, я никогда не пробовал «Android Tools> Fix Project Properties», иногда это может быть и то же самое. Я не знаю, я только что сделал выше, увидев сообщение об ошибке, думая, что что-то не так с путями сборки.


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


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

FYI : в моей последней попытке я попробовал «Android Tools> Fix Project Properties», но для меня это не сработало.

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

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

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

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

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

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

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

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

Eclipse -> Project -> Clean -> Выберите проект и очистите

Я пробовал все вышеупомянутые решения, но не работал для меня. Вот что я сделал, чтобы сделать это. Project-> config build path-> order and export-> move зависимый проект сверху

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

Я столкнулся с этим 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, вы столкнетесь с этой ошибкой.

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

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

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

Или лучше:

NoClassDefFoundError в Java приходит, когда Java Virtual Machine не может найти определенный класс во время выполнения, который был доступен во время компиляции.

С этой страницы. Проверьте это, есть некоторые способы решить эту ошибку. Я надеюсь, что это помогает.

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

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

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

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

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

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

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

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

Я встретил NoClassDefFoundError для класса, который существует в моем проекте (а не в классе библиотеки). Класс существует, но я получил NoClassDefFoundError. В моем случае проблема заключалась в поддержке multidex. Проблема и решение здесь: Android Multidex и библиотеки поддержки

Вы получаете эту ошибку для версий Android ниже 5.0.

Другая идея. Например, у вас есть класс, полученный из «android.support.v4.app.Fragment».

Однако вы допустили ошибку и унаследовали ее от «android.app.Fragment». Тогда вы получите эту ошибку на устройствах Android 2.

Я только что понял что-то с этой ошибкой.

Просто убедитесь, что файл jar библиотеки содержит скомпилированный R-класс в пакете android.support.v7.appcompat и копирует все res в поддержку «project» поддержки app7 «v7» в вашей папке ANDROID_SDK_HOME / extras / android / support / v7 / appcompat.

Я использую Netbeans с плагином Android, и это решило мою проблему.

Я предполагаю, что вы не указываете цель javac при создании общей библиотеки, поэтому javac автоматически использует последнюю доступную цель, которая, скорее всего, 1.7 (Java7) или 1.8 (Java8).

Уже было указано, что

Для Android требуется уровень соответствия компилятора 5.0 или 6.0

Dx инструментов сборки Android <19.0.0 не может преобразовать байт-код Java7 (или выше) в байт-код Dalvik.

Поэтому либо используйте версию build tools> = 19.0.0, либо используйте javac с -target 6 , изменив, например, ваш файл build.xml следующим образом:

 <javac srcdir="src/" destdir="build/" target="6" /> 

Я исправил эту проблему, добавив путь к проекту библиотеки в project.propertied вручную. Некоторые, как затмение не добавило эту запись автоматически вместе с «добавить проект». Поэтому точка, в которой приложение пыталась ссылаться на какой-либо компонент в проекте lib, сбила его.

Вы также можете попробовать то же самое. App dependecy в projec.properties как

android.library.reference.1 = …. \ андроид-SDKs \ Extras \ Google \ google_play_services \ libproject / Google-плей-services_lib

И бежать.

Банки были в папке lib /, теперь они находятся в libs / Если вы используете lib, вы можете переместить свои jars из lib в libs и удалить зависимости от свойств проекта / java, потому что Android теперь найдет их автоматически ,

Для меня проблема заключалась в том, что ссылочная библиотека была построена с использованием java 7. Я решил это путем перестройки с использованием 1.6 JDK.

Некоторое время java.lang.NoClassDefFoundError: появляется ошибка при использовании ART вместо времени выполнения Dalvik. Чтобы изменить время выполнения, перейдите в «Вариант разработчика» -> «Выбрать время выполнения -> Dalvik».

Если ни одно из вышеприведенных действий (как это случилось со мной), и вы используете в качестве библиотеки другой проект в Eclipse.

Сделайте так: Щелкните правой кнопкой мыши проект -> Свойства -> Android -> Библиотека -> Добавить

Это сделало это для меня! Добавление проекта в виде библиотеки (Свойства проекта)

Активность снова добавлена ​​в манифест. Я пробовал в своем манифесте, тогда приложение работало.

  <activity android:name="com.xxx.xxx.MainActivity" 

Попробуйте пойти

  • Проект правой кнопки мыши
  • Путь сборки Java
  • Источник
  • Правая сторона -> Добавить кнопку папки
  • Выбранная папка libs и ОК

Я надеюсь, что это помогает.

В Android Studio:

1) Добавить multiDexEnabled = true в настройке по умолчанию

2) Добавьте компиляцию com.android.support:multidex:1.0.0 в свои зависимости

3) Application class расширяет MultiDexApplication а не просто Application

Решения:

  1. Элемент списка
  2. Проверить экспортный заказ
  3. Включить Multi Dex
  4. Проверьте уровень просмотров api в макете. Я столкнулся с такой же проблемой с searchView. У меня есть проверка уровня api при добавлении searchview, но добавлена ​​реализация SearchView.OnQueryTextListener в файл класса.

1) В файле манифеста укажите название своей деятельности и действие для нее, а также категорию. 2) В своей деятельности укажите свое начальное содержание и укажите свой идентификатор вида в действии.