NoClassDefFoundError для коду в бібліотеці Java на Android


77

У мене досить часто виникають помилки серед моїх користувачів. Програма аварійно завершує роботу під час запуску. Коли передбачається завантаження MainActivity, ВМ, мабуть, не може знайти клас. Я не можу зрозуміти, чому. Архітектура програми полягає в тому, що існує спільний проект, який використовують як моя безкоштовна, так і pro версія. Не знаю, чи це актуально. Дивіться трасування стека нижче. Будь-які думки?

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на щось інше. Це не було справжньою назвою класу. Моє ліжко...!


3
Чому б ви коли-небудь намагалися створити клас у пакунку, який уже існує? ( com.android.*). Це погана форма, спробуйте змінити пакет навколо.
Річард Дж. Росс III

2
Це трапляється лише деколи? чи це відбувається постійно, коли ви будуєте локально?
Девід Т.

2
Це сталося лише для програми, запущеної в Play. Я сам цього не бачив, тому я щойно бачив, як стек отриманий на Crittercism.
kjoelbro

Відповіді:


125

У мене була та сама проблема, я зробив наступне, щоб вирішити проблему.

  1. Перейдіть до "Властивості" проекту.
  2. Виберіть "Шлях побудови Java"
  3. Виберіть вкладку "Замовлення та експорт"
  4. Тут ви повинні побачити шляхи та залежності обраного проекту "src" та "gen".
  5. Порядок їх перерахування спочатку був "src", а потім "gen"
  6. Я їх перемикаю, так що папка "gen" будується перед "src"

gen - автоматизований код у проекті (із залежностей та посилань)
src - вихідний код у проекті

Не було необхідності перезапускати Eclipse. Це тільки почало працювати.

Чесно кажучи, я ніколи не пробував "Інструменти Android> Виправити властивості проекту", іноді це може робити те саме. Я не знаю, я щойно зробив вище, побачивши повідомлення про помилку, думаючи, що щось не так із шляхами збірки.


Редагувати


Пізніше цього було недостатньо, я знову отримував помилку. Потім я "перевірив" усі залежності, перелічені в цьому поданні. Тепер це знову працює. Все йде нормально. Я буду постійно оновлювати це, якщо воно знову не вдасться.

FYI : в останній спробі я спробував "Інструменти Android> Виправити властивості проекту", але у мене це не вийшло.


4
ваш відредагований анс працював і на мене ... тягнув мене за волосся 2-3 години через ClassDefNotFoundError
Пратіва

1
Я залишаю коментар, який колись хтось може знайти. Моя проблема полягала у посиланні на клас із бібліотечного проекту, який не слід було використовувати. Натомість помилку / рішення я знайшов на вкладці "Бібліотеки". Не знаю, чи це колись допоможе комусь, але зараз це в Інтернеті.
Андреас Рудольф,

Ваша пропозиція переключити "gen" на "src" спрацювала, все інше не вдалося! Дякую!
Munchies

Це рішення для мене не спрацювало. Однак переміщення включеного файлу JAR вгору зробило. Це було для AFreeChart. Загалом, зміна порядку складання - це частина цієї відповіді, яка може вирішити цю проблему. NoClassDefFoundError - це важко відстежувана проблема. Як сторона: Я часто видаляю gen, щоб викликати відновлення. У такому випадку gen переміщується на дно. Для мене це ніколи не було проблемою.
Кеннет Еванс,

ось ще одна хітова спроба, яка спрацювала для мене ..... виконала згадані 6 кроків, потім зняла вибір моїх власних бібліотек (jackson ect) у вкладці "Замовлення та експорт"
Шайлендра Сінгх Раджават,

18

Зараз я використовую SDK 20.0.3, і жодне з попередніх рішень не працювало для мене.

Я зміг змусити речі працювати

  • Клацніть правою кнопкою миші проект Android
  • Потім виберіть «Побудувати шлях» -> «Джерело посилання», щоб відкрити діалогове вікно «Джерело посилання».
  • Потім я вказав папку 'src' проекту Java і дав їй назву, відмінну від типової 'src' (наприклад, 'src2').
  • Тепер ви можете клацнути правою кнопкою миші -> видалити нову папку 'src2'.

Це призвело до створених файлів класу Java, які були скомпільовані для віртуальної машини Dalvik замість віртуальної машини Java, коли був побудований проект Android. Це дозволило файлам класу Java у файлі jar-бібліотеки Android пройти спритність під час створення проекту .apk для Android. Тепер, коли додаток запускався, були знайдені класи проекту Java, а не Java.lang.NoClassDefFoundError.

Якщо ви хочете використовувати файл jar замість того, щоб пов'язувати джерело, вам потрібно буде створити проект "Бібліотека Android". (Проект Android з «бібліотекою» позначений у Властивості -> Android.) Потім вам потрібно буде або зв’язати джерело проекту Java з проектом бібліотеки Android, як описано вище, або скопіювати вихідні файли з папки «src» Проект Java до папки 'src' проекту Бібліотеки Android. Створіть проект Бібліотеки Android. Тоді ви зможете скопіювати файл jar проекту Android Project, який був створений у папку 'libs' папки Android, оскільки файли класів у ньому були скомпільовані для віртуальної машини Davlik замість віртуальної машини Java під час побудови проекту Android. Це дозволяє файлам класу Java у файлі jar-бібліотеки Android проходити через спритність, коли створюється проект .apk Android.


17

Спробуйте перейти до Проект -> Властивості -> Шлях побудови Java -> Замовлення та експорт і переконайтеся, що приватні бібліотеки Android перевіряються для вашого проекту та для всіх інших бібліотечних проектів, які ви використовуєте. я отримав рішення, перейшовши за посиланням нижче NoClassDefFoundError Android Project ?


8

Про всяк випадок, коли це комусь допомагає, я зіткнувся з тим же питанням. Мій файл jar знаходився в каталозі libs, і jar був доданий до шляху збірки. Все-таки він кидав цей виняток.

Я просто очистив проект, і він у мене спрацював.

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


7

Я спробував усі вищезазначені рішення, але не розробив для мене, ось що я зробив, щоб це зробити проект-> конфігурація побудови шляху-> замовлення та експорт-> переміщення залежного проекту зверху


6

Ця помилка також генерується, коли ви створюєте програму, яка використовує Google API (наприклад, Карти), але запускає її на пристрої, націленому на Android API.


1
це нарешті вирішило мою проблему. якось функція властивостей проекту виправлення не змінює цільову. я виправив це, оновивши свій google api
boreas

5

Я зіткнувся з цією помилкою 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, ви зіткнетеся з цією помилкою.

Моє рішення полягає в тому, що я скопіював цей вихідний код у свій код!


1
+1 Я спробував використати файл .jar, який я скомпілював з Java 1.7. Після перекомпіляції банки з Java 1.6 він працював нормально.
Саймон Форсберг

4

Опис NoClassDefFoundError - з тегу SO:

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

Або краще:

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

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


Дякую Альберто! Ваша публікація допомогла мені зрозуміти проблему. Зараз мені цікаво, як Android обробляє шлях до класу. В даний час цей випуск: stackoverflow.com/questions/1095322 / ...
kjoelbro

@Kjoendo Ласкаво просимо. Я прочитаю посилання на цю проблему. :)
Альберто Солано

У мене щойно це було для ConcurrentSkipListMap; Думаю, це тому, що моя програма працювала на пристрої Froyo, і цей клас у Froyo відсутній; однак, AdMob вимагає від мене націлення на бутерброд із морозивом, щоб я цього не помітив!
Andrew Wyld,

4

У моєму випадку я намагався додати звичайний клас 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.


3

Для мене ця проблема була пов'язана з API, який я використовував і не розгортався. Наприклад, я використовував a ZSDK_API.jarяк посилання.

Щоб вирішити проблему, мені довелося клацнути правою кнопкою миші на проекті та вибрати властивості. З JAVA BUILD PATH мені довелося додати API, який не розгортався. Це було дивно, оскільки додаток кидав клас MainActivity, який не знайдено, а насправді помилка була спричинена тим, що клас DiscoveryHandler не був знайдений.

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


2

Я познайомився з NoClassDefFoundError для класу, який існує у моєму проекті (не для бібліотечного класу). Клас існує, але я отримав NoClassDefFoundError. У моєму випадку проблема полягала в підтримці мультидекса. Проблема та рішення тут: Android Multidex та бібліотеки підтримки

Ви отримуєте цю помилку для версій Android нижче 5.0.


2

В Android Studio:

1) Додати multiDexEnabled = trueв вашому замовчуванням Config

2) Додайте компіляцію com.android.support:multidex:1.0.0 у свої залежності

3) Application class продовжити MultiDexApplicationзамість простоApplication


1

Інша ідея. Наприклад, у вас є клас, похідний від "android.support.v4.app.Fragment".

Однак ви допустили помилку та успадкували її від "android.app.Fragment". Тоді у вас буде ця помилка на пристроях Android 2.


1

Я щойно придумав щось із цією помилкою.

Просто переконайтеся, що файл jar бібліотеки містить скомпільований клас R під пакетом android.support.v7.appcompat і скопіюйте всі результати в "проекті" підтримки vcom appcompat у вашу папку ANDROID_SDK_HOME / extras / android / support / v7 / appcompat.

Я використовую Netbeans з плагіном Android, і це вирішило мою проблему.


1

Я припускаю, що ви не вказуєте 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"
/>

0

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

Ви також можете спробувати те саме. залежність програми в проекційних властивостях, таких як

android.library.reference.1 = .... \ android-sdks \ extras \ google \ google_play_services \ libproject / google-play-services_lib

і біжи.


0

jars раніше знаходились у папці lib /, тепер вони знаходяться у libs / Якщо ви використовуєте lib, ви можете перемістити свої банки з lib у libs та видалити залежності з властивостей проекту / шляху побудови java, оскільки Android тепер їх знайде автоматично .


0

Для мене проблема полягала в тому, що бібліотека, на яку посилаються, була побудована за допомогою java 7. Я вирішив це шляхом відновлення за допомогою 1.6 JDK.


0

Деякий час java.lang.NoClassDefFoundError: помилка з'являється при використанні ART замість середовища виконання Dalvik. Щоб змінити час роботи, просто перейдіть у Параметр розробника -> Виберіть час виконання -> Dalvik.


0

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

Зробіть так: Проект правою кнопкою миші -> Властивості -> Android -> Бібліотека -> Додати

Це зробило це для мене! Додавання проекту як бібліотеки (властивості проекту)


0

Діяльність знову додана до маніфесту. Я спробував у своєму маніфесті, тоді додаток працював.

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

0

Спробуйте перейти до

  • Клацніть правою кнопкою миші проект
  • Шлях побудови Java
  • Джерело
  • справа -> кнопка Додати папку
  • вибрану папку libs та OK

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


0

Рішення:

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

-4

1) У файлі маніфесту згадайте назву вашої діяльності та дію щодо неї, а також категорію. 2) У своїй діяльності згадайте свій початковий перегляд вмісту та згадайте ідентифікатори свого перегляду в цій діяльності.


Хтось помилково позначив це як не відповідь. Це спроба відповіді, і тому кваліфікується як відповідь. Якщо вам не подобається відповідь, правильна дія полягає в тому, щоб проголосувати за неї (як уже 5 людей), а не позначати її. Побачте свою відповідь в іншому замку - Коли відповідь не є відповіддю: meta.stackexchange.com/questions/225370/…
ArtOfWarfare
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.