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

24 75

24 ответа:

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

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

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

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

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


Edit


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

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

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

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

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

Это привело к созданию файлов классов Java, которые были скомпилированы для виртуальной машины Dalvik вместо виртуальной машины Java при создании проекта Android. Это позволило файлам классов Java в файле jar библиотеки Android пройти через dexing, когда проект Android.АПК был создан. Теперь, когда приложение было запущено классы проекта Java были найдены вместо Java.ленг.Ошибке типа noclassdeffounderror быть брошенным.

Если вы хотите использовать файл jar вместо связывания источник, то вам нужно будет создать библиотеку Android проекта. (Проект Android с проверкой "is library" в свойствах - > Android.) Затем вам нужно будет либо связать источник проекта Java с проектом библиотеки Android, как описано выше, либо скопировать исходные файлы из папки " src "проекта Java в папку" src " проекта библиотеки Android. Создайте проект библиотеки Android. Затем вы сможете скопировать файл Jar проекта Android, который был создан в "libs" папка папки Android, потому что файлы классов в ней были скомпилированы для виртуальной машины Davlik вместо виртуальной машины Java при создании проекта Android. Это позволяет файлы классов Java в файле jar библиотеки Android, чтобы пройти через dexing, когда проект Android .apk создается. Теперь, когда приложение запускается классы проекта Java будут найдены вместо Java.ленг.Ошибке типа noclassdeffounderror быть брошенным.

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

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

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

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

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

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

Я столкнулся с этим NoClassDefFoundError, когда я использовал java.НИО.кодировка.StandardCharsets.

причина в том, что стандартные наборы не существовали до JRE 1.7. Если я установлю версию компиляции java в 1.7, Eclipse пожаловался, что"Android требует уровня соответствия компилятора 5.0 или 6.0". Итак, я исправил это, щелкнув правой кнопкой мыши имя проекта->Android Tools->Fix Project Properties. Он скомпилирован с JRE1.6.

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

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

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

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

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

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

или лучше:

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

с этой

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

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

надеется, что это помогает кто-то.

в моем случае я пытался добавить обычный класс 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.

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

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

On Android Studio:

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

2) добавить скомпилировать com.андроид.поддержка:multidex:1.0.0 в своем зависимости

3)Application class extend MultiDexApplication вместо Application

другая идея. Например, у вас есть класс, производный от "Андроид.поддержка.v4.приложение.Фрагмент."

однако вы ошиблись и унаследовали его от "android.приложение.Фрагмент." Тогда у вас будет эта ошибка на устройствах Android 2.

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

просто убедитесь, что файл библиотеки jar содержит скомпилированный класс R под android.поддержка.v7.пакет совместимости приложений и скопировать все РЭС в В7 совместимости приложений-поддержка "проект" в свои ANDROID_SDK_HOME/дополнительно/андроид/поддержка/В7/совместимости приложений папке.

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

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

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

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

dx из инструментов сборки Android

поэтому либо используйте версию инструментов сборки >= 19.0.0, либо используйте javac С -Задача 6, изменяя, например, ваш муравей build.xml такой:

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

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

вы также можете попробовать то же самое . приложение dependecy в проекте.свойства как

android.библиотека.ссылка.1=....в папке Android-SDK, с\массовки\Гугл\google_play_services\libproject/Гугл-Плей-services_lib

и запустить .

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

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

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

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

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

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

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

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

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

  • щелкните правой кнопкой мыши проект
  • Java build path
  • источник
  • справа -> Добавить папку
  • выбранная папка libs и OK

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

решения:

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

1)в файле манифеста укажите ваше имя действия и действие для него и тоже категория . 2)в своей деятельности упомяните свой начальный contentview и упомяните, что Ваш идентификатор просмотра находится в действии.