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]

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

Ответ 1

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

  • Перейдите в "Свойства" проекта.
  • Выберите "Путь сборки Java"
  • Выберите вкладку "Заказ и экспорт".
  • Здесь вы должны увидеть пути и зависимости выбранного проекта "src" и "gen" .
  • Порядок их перечисления был первым "src" , а затем "gen" path
  • Я переключаю их, так что папка "gen" создается до "src"

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

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

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


Edit


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

FYI: в моей последней попытке я попробовал "Инструменты Android > Исправить свойства проекта", но для меня это не сработало.

Ответ 2

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

Я смог заставить работу работать

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

Это привело к созданию созданных файлов классов Java, которые были скомпилированы для виртуальной машины Dalvik вместо 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.

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

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

Или лучше:

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

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

Ответ 9

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

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

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

Ответ 10

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

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

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

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

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

Ответ 11

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

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

Ответ 12

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

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

Ответ 13

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

Просто убедитесь, что файл jar библиотеки содержит скомпилированный R-класс в пакете android.support.v7.appcompat и скопируйте все результирующие файлы в поддержку проекта v7 appcompat в проекте ANDROID_SDK_HOME/extras/android/support/v7/папка appompat.

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

Ответ 14

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

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

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

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

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

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

Ответ 15

В Android Studio:

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

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

3) Application class расширьте MultiDexApplication вместо просто Application

Ответ 16

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

вы также можете попробовать одно и то же. app dependecy в projec.properties, например

android.library.reference.1 =....\андроид-SDKs\Extras\Google\google_play_services\libproject/Google-игра-services_lib

и запустите.

Ответ 17

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

Ответ 18

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

Ответ 19

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

Ответ 20

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

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

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

Ответ 21

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

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

Ответ 22

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

  • Щелкните правой кнопкой мыши проект
  • путь сборки Java
  • Источник
  • правая сторона → Добавить кнопку папки
  • выбранная папка libs и ОК

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

Ответ 23

Решения:

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

Ответ 24

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