NoClassDefFoundError - затемнення та Android


193

У мене виникають проблеми при спробі запустити додаток для Android, який до моменту додавання другої зовнішньої бібліотеки до шляху її збирання працював чудово. Оскільки я додав банку "scoreninja", я отримую NoClassDefFoundError, коли намагаюся запустити додаток.

Ось повідомлення:

02-11 21:45:26.154: ERROR/AndroidRuntime(3654): java.lang.NoClassDefFoundError: com.scoreninja.adapter.ScoreNinjaAdapter

Оскільки всі сценарії збірки створюються інструментами Android (?), Я не впевнений, що ще можу зробити, крім очищення та відновлення або перезавантаження затемнення (я вже спробував усі три). Хтось знає, як я можу це змінити?


1
Як ви додали файл jar? Ви додали, використовуючи шлях збірки -> Бібліотеки -> Зовнішні банки ??
Teja Kantamneni

1
Клацніть правою кнопкою миші проект> Складіть
Tom R

4
Якщо ви оновили ADT в останній час , а потім подивитися на відповідь Джона нижче (і upvote його!) Stackoverflow.com/a/9916751/489852
Атул GOYAL

1
Якщо у вас виникло це питання, перш ніж перейти до відповіді Джона, відповідь @Till нижче - це вирішує і для багатьох людей.
Карлос П

Ви пробували мультидекс?
Ashish Rawat

Відповіді:


234

У мене виникла ця проблема після оновлення ADT.

Я зберігав усі мої файли JAR у папці під назвою "lib" і додав банки в шлях збирання звичайним способом Eclipse. Це працювало чудово до мого оновлення.

Після мого оновлення я отримував NoClassDefFoundError для класу, який, я міг чітко бачити, був включений у банку (перевірка класів ReferencedLibraries).

Рішенням було вилучити мої банки зі шляху збірки та перейменувати папку "lib" на "libs". Це мурашина умова, і, мабуть, новий ADT знаходить і включає бібліотеки у файл .apk. Як тільки я це зробив, все спрацювало нормально.


1
Дуже дякую! До вчорашнього оновлення ADT у мене не було ні папки lib, ні libs, і все працювало нормально. Після оновлення у всіх зовнішніх баночок виникла ця проблема. Вони були виправлені завдяки вашій відповіді. Я маю поєднати твою з Брайаном, щоб вона працювала.
Гонг

Дякую, Джон! Додам, що після зміни папки на libs мені довелося перезапустити затемнення, щоб воно працювало.
Michaeldcooney

5
Я зіткнувся з тією ж проблемою після оновлення ADT, але я зберігав свої банки в каталозі поза моїм проектом і включав їх як бібліотеку користувачів у свій шлях збирання. Рішення полягало в тому, щоб видалити бібліотеку користувачів із мого шляху збирання і замість цього включити банки, використовуючи "Додати зовнішні банки", а потім зробити їх експортованими, встановивши прапорці на вкладці "Замовлення та експорт".
Тревіс

1
Я посилав android-support-v13.jar як зовнішню бібліотеку на C: \ android-sdk-windows \ extras \ android \ сумісності \ v13. Я перемістив цей JAR у папку libs проекту та видалив посилання з Java Build Path -> Libraries. Чиста конструкція, і я збирався знову.
Snowwire

Привіт. я спробував наш підхід, додавши зовнішні лінзи jar всередину / libs, і тепер я отримую цю помилку: Перехід у формат Дальвіка не вдалося з помилкою 1
Джонатан

100

Мені не потрібно було ставити бібліотеку jar в активи або lib (s), а лише встановити прапорець для цієї баночки в Properties (Властивості) -> Java Build Path -> "Замовлення та експорт" (вона була зазначена раніше, але не вибрана )


Дуже дякую! Я давно боровся з цією помилкою, і все, що мені потрібно було зробити, це перевірити проклятий ящик для баночки на екрані "Замовлення та експорт". Найсмішніше, що мені довелося це зробити лише для того, щоб він працював на емуляторі Nook Tablet. Не виникли проблеми на пристроях чи інших емуляторах.
Луїс

5
Хтось знає, чому вам потрібно зробити те і інше, додати бібліотеку, а також встановити прапорець у порядку замовлення та експорту? Чи є причина, чому я хотів би додати зовнішній JAR, але не включити його до порядку замовлення та експорту?
Лу Морда

У мене була проблема після оновлення ADT, і це вирішило її для мене.
cdavidyoung

5
Це допомогло мені, але лише після того, як я зробив Project -> Clean
altumano

Дякую!! Врятувало мене. Довелося зробити очищення та перезапустити після встановлення Eclipse Juno.
Рінардт

68

Додаючи зовнішню банку в шлях збирання просто додає банку до вашого пакету, але він не буде доступний під час виконання.

Для того, щоб баночка була доступна під час виконання , потрібно:

  • Покладіть банку під свою assetsпапку
  • Включіть цю копію баночки до шляху збирання
  • Перейдіть на вкладку експорту в тому ж спливаючому вікні
  • Поставте прапорець біля щойно доданої банки

ScoreNinjaAdapter - це чийсь код, але я був би дуже здивований, якби він містив таку помилку, як це є у загальному користуванні. Помилка трапляється в моєму власному коді.
Том R

Помилка тут буквально відбувається: sna = new ScoreNinjaAdapter (це, SN_APP_ID, SN_APP_KEY);
Том R

Вам потрібна importзаява для зовнішніх файлів jar? Я ніколи їх не використовував.
Ентоні Форлоні

Ви спробували видалити файл .jar із assestsпідходу до папки?
Ентоні Форлоні

Так. Врешті-решт я набридла всім цим і просто завантажила джерело та скопіювала вихідні файли у свій проект. Не найприємніше рішення, але воно працює зараз. Дякую за всю вашу допомогу.
Том R

48

У мене це було для MapActivity. Builds в Eclipse отримує NoClassDefFound у відладчику.

Забули додати бібліотеку до маніфесту, всередині <Application>...</Application>елемента

<uses-library android:name="com.google.android.maps" />

27

Я змінив порядок включених проектів (Eclipse / Configure Build Path / Order and Export). Я перемістив два залежні проекти до початку списку "Замовлення та експорт". Це вирішило проблему "NoClassDefFoundError".

Мені це дивно. Я не чув про важливість порядку включених бібліотек та проектів. Android + Eclipse - це весело :)


Це також рішення, про яке згадується другий коментар користувача тут у груповому звіті: code.google.com/p/android/isissue/detail?id=55304
arberg

15

Я не впевнений, чи це пов’язано, чи ви навіть все ще шукаєте відповіді, але я натрапив на цю тему, намагаючись дослідити ту саму помилку (але, можливо, з різних причин).

Я не зміг знайти жодного рішення в Інтернеті, але відповідь на подібній темі змусив мене задуматися і зрозумів, що, ймовірно, мені просто потрібно було відновити (чи очистити) проект.

У Eclipse перейдіть до Project => Clean. Виберіть свій проект, і Eclipse, здавалося, виправляє його сам. Для мене це вирішило проблему.

Сподіваюся, це допомагає.


Так, здається, в Eclipse / ADT / dex / є помилка, що в основному не вистачає класів у збірці. Він також може пропустити Applicationклас, що призводить до іншої помилки.
Timmmm

13

Я зіткнувся з тим же питанням. Причиною було те, що бібліотека, яку я намагався використати, була зібрана зі стандартного JDK 7.

Я перекомпілював його з -source 1.6 -target 1.6варіантами, і він прекрасно працював.


ДЯКУЮ ВАСУ ВУУУУУУУУУУ !!!!!!!!!!!!!!!!!!! Мене розчарувала ця проблема, і ти її вирішив! Дещо іронічно, що навіть найновіший Jelly Bean 4.3 SDK (API 18) все ще не може прочитати 1.7 JAR / класи. І найгірше, що вона зовсім не скаржиться :(
Хенді Іраван

У мене була така ж проблема. Найгірше те, що я подумав у цьому варіанті, а потім змінив -source 1.7 на -source 1.5 (щоб бути впевненим), і проблема не була вирішена. Але, прочитавши ваш коментар, я спробував ще раз з 1.6 і потім, це спрацювало як шарм.
Педро Наньєс

7

Для мене працювало те саме: Властивості -> Шлях збірки Java -> "Замовлення та експорт" Цікаво - чому це не робиться автоматично? Я думаю, деякі налаштування відсутні. Також це сталося для мене після оновлення SDK.


3

Клацніть правою кнопкою миші папку проекту, знайдіть Властивості в шляху збирання Java та виберіть файли jar, які ви бачите. Це спрацювало на мене.



2

Я спробував усе з цієї публікації (і деякі інші пости), і це не спрацювало для мене, це, безумовно, найстрашніше оновлення ADT, яке я пережив, і я ніколи не оновлююсь без робочої резервної копії ADT.

Мені вдалося вирішити його, видаливши проект, а потім знову додавши його за допомогою резервної копії джерела, яку я мав.


2

У мене була така сама помилка з ADT22. Вирішили це, перевіривши "Приватні бібліотеки Android" у властивостях -> Шлях збірки Java -> Замовлення та експорт. Якщо ви використовуєте будь-які бібліотечні проекти, те саме слід зробити і для них.


Це також працювало для мене. Я включив бібліотеку, але забув перевірити її в "Замовлення та експорт". Дякую!
jmrodrigg

2

Усі існуючі відповіді для мене не працюють, оскільки мій випадок трохи інший. На роботу мені знадобилося кілька годин. Я використовую Eclipse.

Мій андроїд-проект включає ще один звичайний проект java 1.6, який потребує стороннього файлу jar. Хитрість:

  • включіть банку в звичайний проект java, щоб він збирався (лише), не перевіряйте його на вкладці "Замовлення та експорт"
  • також скопіюйте цей jar-файл у папку "libs" проекту Android, щоб він був доступний під час виконання

Сподіваюся, це допоможе тим, хто має подібні сценарії, як у мене.


1

іноді доводиться сприймати весь зовнішній проект як бібліотеку, а не лише банку:

мою проблему вирішили, додавши весь проект (у моєму випадку google-play-services_lib) як бібліотеку, а не лише банку. кроки до нього (від @style відповіді ):

  1. Файл-> Нове-> Інше
  2. Виберіть Android Project
  3. Виберіть "Створити проект із наявного джерела"
  4. Натисніть кнопку "Оглянути ..." та перейдіть до потрібного проекту
  5. Завершити (проект проекту панелі дій у вашому робочому просторі)
  6. Клацніть правою кнопкою миші ваш проект -> Властивості
  7. У розділі Android-> Бібліотека натисніть кнопку Додати
  8. виберіть нещодавно доданий проект -> Добре

1

Іноді це станеться через те, що у ваш AndroidManifest.xml не включений ярлик, від якого у вас залежність, з тегом "use-libary".

Також переконайтеся, що він повинен бути всередині тегу "application".

З повагою,

Раві


1

У мене була ця проблема, і вона була викликана тим, що не "експортувала" бібліотеку. Іспит був лише тому, що файли .class для деяких класів недоступні під час упаковки файлу APK.Compile, він буде добре працювати з не експортуванням

У моєму випадку я використовував клас "CusrsorAdapter", а під "JavaBuildPath-> Замовлення та експорт" я не перевіряв підтримку V4 jar.Після того, як вибрано питання, зникає.

Щоб переконатися, що ви отримуєте noClassDefFound помилку через вищезгадану причину, будь ласка, перевірте свій logacat, ви побачите невідому помилку суперкласів під час виконання.



0

Я спробував різні речі, і причиною помилки в моєму випадку був конфлікт між maps.jar та Google Api в Java Build Path-> Libraries. Отже, коли я видалив maps.jar, він добре працював.

З повагою,

wahib


0

будь ласка, переконайтеся, що ваш jar файл знаходиться в каталозі libs вашого проекту, коли ви використовуєте новішу версію ADT зі своїм затемненням.


0

У мене з'явилася та сама проблема ... Щоб виправити це, я просто видалив свої Android Private Libs в "шляху до збірки" і натиснув гаразд ... і коли я відкрив op, "шлях до збірки" знову затемнення додав їх знову, а потім це працювало для мене;) ...


0

Я провів два дні, намагаючись вирішити це питання після оновлення ADT. нарешті мені пощастило отримати цю посаду тут:

https://code.google.com/p/android/isissue/detail?id=55304

що вело мене в правильному напрямку. коли ви дотримуєтеся рішення, не забудьте замінити бібліотеку підтримки Android для всіх ваших проектів на одну і ту ж версію (видаліть її та повторно встановіть її до проектів). Я сподіваюся, що це допомагає - удачі


0

Якщо ви хочете знати, які файли стосуються вирішення питання, ось що я знайшов. Просто змініть .classpath файл на

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="src" path="gen"/>
    <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
    <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
    <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
    <classpathentry kind="output" path="bin/classes"/>
</classpath>

Замініть файл .classpath у всіх проектах бібліотеки та в головному проекті Android. Файл .classpath знаходиться в кореневій папці проекту eclipse. Зважаючи на це, не забудьте додати свої власні записи класного шляху, якщо у вас є такі (тому порівняйте з вашою поточною версією .classpath).

Я вважаю, що це той самий результат, що й через меню затемнення, як пояснив componavt-користувач, описаний вище (Eclipse / Configure Build Path / Order and Export).


0

Рішення тут спрацювало для мене. Справа в тому, щоб імпортувати бібліотеку в папку libs, потім змінити файл build.gradle, а потім очистити gradlew.


0

Якщо ви зміните своє замовлення та експортуєте на шляху створення проекту, ця помилка не виникне. Інший спосіб досягти цього - через .classpath у папці вашого проекту.


0

Спробуйте це:-

Крок 1

Додайте всі бібліотеки, щоб створити pat в Eclipse (означає зробити всі бібліотеки посиланнями на бібліотеки)

Крок 2

Видаліть файл R.java і знову створіть проект. Не хвилюйтесь, R.java автоматично відтвориться.

Застуда :)


0

Як я зрозумів, у вашому проекті немає помилок, оскільки ви включили Jar. Але Jar не буде використовуватися, коли ваш Проект "експортується" на пристрій. Спробуйте це

Проект -> Властивості

Java Build Path / Замовлення та експорт

[✔] Твій Жар


0

Це трапляється зі мною досить часто.

Минулого разу, що я можу згадати, було спричинено переключенням Eclipse ADT (спеціальне видання Google) на Android Studio та поверненням назад. Я в основному спробував усі методи, які я міг знайти на stackoverflow, який не працював для мене.

Врешті-решт я змусив програму знову працювати (більше немає NoCalssDeffoundError), переключивши свій IDE на оригінальний Eclipse (Kepler) з ADT.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.