NoClassDefFoundError для кода в библиотеке Java на Android
Я часто сталкиваюсь с ошибкой среди моих пользователей. Приложение вылетает при запуске. Когда предполагается загрузка 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 ответа
У меня была та же проблема, я сделал следующее, чтобы решить проблему.
- Зайдите в "Свойства" проекта.
- Выберите "Путь сборки Java"
- Выберите вкладку "Заказ и экспорт"
- Вы должны увидеть пути и зависимости выбранного проекта "src" и "gen" здесь.
- Порядок, в котором они перечислены, был сначала "src", а затем "gen" путь
- Я переключаю их, чтобы папка "gen" была собрана перед "src"
gen - автоматизированный код в проекте (из зависимостей и ссылок)
src - исходный код в проекте
Не было необходимости перезапускать Eclipse. Это только начало работать.
Честно говоря, я никогда не пробовал "Инструменты Android> Исправить свойства проекта", иногда это может быть то же самое. Я не знаю, я только что сделал выше, увидев сообщение об ошибке, думая, что что-то не так с путями сборки.
редактировать
Позже этого было недостаточно, я снова получил ошибку. Затем я "проверил" все зависимости, перечисленные в этом представлении. Теперь это работает снова. Все идет нормально. Я буду держать это в курсе, если он снова не удастся.
К вашему сведению: в своей последней попытке я попробовал "Инструменты Android> Исправить свойства проекта", но у меня ничего не вышло.
В настоящее время я использую SDK 20.0.3, и ни одно из предыдущих решений не помогло мне.
Я смог заставить вещи работать
- Правый клик по проекту Android
- Затем выберите Build Path -> Link Source, чтобы открыть диалоговое окно Link Source.
- Затем я указал папку 'src' проекта Java и дал ей имя, отличное от значения по умолчанию 'src' (например, 'src2').
- Теперь вы можете щелкнуть правой кнопкой мыши -> удалить новую папку 'src2'.
Это привело к созданию созданных файлов классов Java, которые были скомпилированы для виртуальной машины Dalvik вместо виртуальной машины Java при создании проекта Android. Это позволило файлам классов Java в jar-файле библиотеки Android пройти дексинг при создании проекта Android.apk. Теперь, когда приложение было запущено, вместо проекта Java.lang.NoClassDefFoundError были найдены классы проекта Java.
Если вы хотите использовать JAR-файл вместо ссылки на источник, вам нужно будет создать проект Library 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.
Попробуйте перейти в "Проект" -> "Свойства" -> "Путь сборки Java" -> "Порядок и экспорт" и убедитесь, что частные библиотеки Android проверены для вашего проекта и всех других используемых вами библиотечных проектов. я получил решение, перейдя по ссылке ниже NoClassDefFoundError Android Project?
На всякий случай, если это кому-то поможет, я столкнулся с той же проблемой. Мой файл jar находился в каталоге libs, и файл jar был добавлен в путь сборки. Тем не менее это бросало это исключение.
Я только что очистил проект, и он работал на меня.
Eclipse -> Проект -> Очистить -> Выбрать проект и очистить
Я испробовал все вышеперечисленные решения, но у меня ничего не вышло. Вот что я сделал, чтобы сделать это: проект-> путь компоновки конфигурации-> порядок и экспорт-> переместить зависимый проект сверху
Эта ошибка также возникает, когда вы создаете приложение, которое использует API Google (например, Карты), но запускаете его на устройстве, которое предназначено для API Android.
Я столкнулся с этим 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 не может найти определенный класс во время выполнения, который был доступен во время компиляции.
с этой страницы. Проверьте это, есть несколько способов устранить ошибку. Я надеюсь, что это помогает.
В моем случае я пытался добавить обычный класс 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.
Для меня эта проблема была связана с тем, что используемый мной API не был развернут. Например, я использовал ZSDK_API.jar
в качестве ссылки.
Чтобы решить эту проблему, я должен был щелкнуть правой кнопкой мыши на проекте и выбрать свойства. Из JAVA BUILD PATH мне пришлось добавить API, который не был развернут. Это было странно, поскольку приложение выбрасывало класс MainActivity, который не был найден, и на самом деле ошибка была вызвана тем, что класс DiscoveryHandler не был найден.
Надеется, что это помогает кому-то.
Я встретил NoClassDefFoundError для класса, который существует в моем проекте (не класс библиотеки). Класс существует, но я получил NoClassDefFoundError. В моем случае проблема была в поддержке мультидекса. Проблема и решение здесь: Android Multidex и поддержка библиотек
Вы получаете эту ошибку для версий Android ниже 5.0.
На Android Studio:
1) Добавить multiDexEnabled = true
в вашей конфигурации по умолчанию
2) Добавьте компиляцию com.android.support:multidex:1.0.0 в ваши зависимости
3) Application class
простираться MultiDexApplication
вместо просто Application
Я только что понял с этой ошибкой.
Просто убедитесь, что файл jar библиотеки содержит скомпилированный класс R в пакете android.support.v7.appcompat и скопируйте все остальные данные в проекте проекта поддержки app v7 в папку ANDROID_SDK_HOME/extras/android/support/v7/appcompat.
Я использую Netbeans с плагином Android, и это решило мою проблему.
Другая идея. Например, у вас есть класс, производный от "android.support.v4.app.Fragment".
Однако вы допустили ошибку и унаследовали ее от "android.app.Fragment". Тогда у вас будет эта ошибка на устройствах Android 2.
Я предполагаю, что вы не указываете javac
является целью при создании общей библиотеки, поэтому javac
автоматически использует последнюю доступную цель, которая, вероятно, составляет 1,7 (Java7) или 1,8 (Java8).
Уже было заявлено, что
Android требует уровня соответствия компилятора 5.0 или 6.0
dx
из инструментов сборки Android < 19.0.0 не может преобразовать байт-код Java7 (или выше) в байт-код Dalvik.
Так что или используйте версию инструментов сборки>= 19.0.0 или используйте javac
с -target 6, изменяя, например, ваш муравей build.xml
как это:
<javac
srcdir="src/"
destdir="build/"
target="6"
/>
jar-файлы раньше находились в папке lib/, теперь они в libs/. Если вы используете lib, вы можете переместить ваши jar-файлы из lib в libs и удалить зависимости из свойств проекта / пути сборки java, поскольку Android теперь будет автоматически их находить,
Некоторое время java.lang.NoClassDefFoundError: ошибка появляется при использовании ART вместо среды выполнения Dalvik. Чтобы изменить время выполнения, просто зайдите в Developer Option -> Выберите Runtime -> Dalvik.
Для меня проблема заключалась в том, что указанная библиотека была построена с использованием Java 7. Я решил эту проблему путем перестройки с использованием 1.6 JDK.
Попробуйте перейти к
- Щелкните правой кнопкой мыши проект
- Путь сборки Java
- Источник
- правая сторона -> кнопка Добавить папку
- выбранная папка libs и OK
Я надеюсь, что это помогает.
Решения:
- Элемент списка
- Проверить порядок экспорта
- Включить мульти Dex
- Проверьте API-уровень просмотров в макете. Я столкнулся с той же проблемой с searchView. Я проверял уровень API при добавлении searchview, но добавил, что реализует SearchView.OnQueryTextListener в файл класса.
Активность снова добавлена в манифест.
<activity
android:name="com.xxx.xxx.MainActivity"
Я исправил эту проблему, добавив путь к проекту библиотеки в project.propertied вручную. некоторые как eclipse не добавили эту запись автоматически вместе с "добавить проект". поэтому точка, в которой приложение пыталось сослаться на любой компонент внутри проекта lib, вылетала.
Вы также можете попробовать то же самое. зависимость приложения в projec.properties, как
android.library.reference.1=....\ андроид-SDKs\ Extras\ Google\google_play_services\libproject/ Google-плей-services_lib
и беги.
Если ничего из вышеперечисленного не работает (как это случилось со мной), и вы используете в качестве библиотеки другой проект в Eclipse.
Сделайте так: Щелкните правой кнопкой мыши проект -> Свойства -> Android -> Библиотека -> Добавить
Это сделало это для меня! Добавление проекта в виде библиотеки (Свойства проекта)
1) В файле манифеста укажите название вашей деятельности и действия для нее, а также категорию. 2) В своей Деятельности укажите свой начальный контент-вид и укажите свои идентификаторы просмотров в действии.