web-dev-qa-db-fra.com

NoClassDefFoundError pour le code dans une bibliothèque Java sur Android

Je rencontre souvent une erreur parmi mes utilisateurs. L'application se bloque lors du démarrage. Lorsque MainActivity est censé être chargé, la VM ne peut apparemment pas trouver la classe. Je ne peux pas comprendre pourquoi. L’architecture de l’application repose sur le fait qu’il existe un projet commun que ma version gratuite et ma version professionnelle utilisent. Je ne sais pas si c'est pertinent. Voir la trace de pile ci-dessous. Des pensées?

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: .__ Merci pour le commentaire ci-dessous, Richard. Maintenant, j'ai changé com.Android.Splash en quelque chose d'autre. Ce n'était pas le vrai nom de classe de toute façon. Ma faute...!

75
kjoelbro

J'ai eu le même problème, j'ai fait ce qui suit pour résoudre le problème.

  1. Allez dans "Propriétés" du projet.
  2. Sélectionnez "Chemin de construction Java"
  3. Sélectionnez l'onglet "Commander et exporter"
  4. Vous devriez voir les chemins et les dépendances "src" et "gen" du projet sélectionné ici.
  5. L'ordre dans lequel ils ont été listés était d'abord "src" puis "gen"
  6. Je les change pour que le dossier "gen" soit construit avant le "src"

gen - code automatisé dans le projet (à partir de dépendances et de références)
src - code source dans le projet

Il n'était pas nécessaire de redémarrer Eclipse. Cela a juste commencé à fonctionner. 

Honnêtement, je n'ai jamais essayé "Outils Android> Propriétés du projet de réparation", parfois cela pourrait être la même chose. Je ne sais pas, je viens de faire ci-dessus après avoir vu le message d'erreur, en pensant que quelque chose ne va pas avec les chemins de construction.


Modifier


Plus tard, ce n’était pas suffisant, c’était à nouveau le cas. Puis j'ai "vérifié" toutes les dépendances listées dans cette vue. Maintenant cela fonctionne à nouveau. Jusqu'ici tout va bien. Je garderai cette mise à jour si elle échoue à nouveau. 

FYI: lors de ma dernière tentative, j'ai essayé "Outils Android> Propriétés du projet de réparation", mais cela n'a pas fonctionné pour moi.

125
Sabo

J'utilise actuellement le SDK 20.0.3 et aucune des solutions précédentes ne fonctionnait pour moi. 

J'ai pu faire fonctionner les choses en

  • Clic droit sur le projet Android
  • Puis sélectionnez Chemin de construction -> Source de lien pour afficher la boîte de dialogue Source de lien.
  • Ensuite, j'ai spécifié le dossier "src" du projet Java et lui ai attribué un nom autre que celui par défaut de "src" ("src2", par exemple).
  • Vous pouvez maintenant cliquer avec le bouton droit de la souris sur -> supprimer le nouveau dossier 'src2'.

Cela entraînait la création de fichiers de classe Java compilés pour Dalvik VM au lieu de Java VM lors de la construction du projet Android. Cela permettait aux fichiers de classe Java du fichier jar de la bibliothèque Android de passer par la résolution lors de la création du projet Android .apk. Désormais, lors de l'exécution de l'application, les classes du projet Java ont été trouvées à la place d'une erreur Java.lang.NoClassDefFoundError.

Si vous souhaitez utiliser un fichier jar au lieu de lier la source, vous devez créer un projet Library Android. (Un projet Android dont la propriété est cochée dans Propriétés -> Android.) Vous devrez ensuite associer la source du projet Java au projet de bibliothèque Android, comme décrit ci-dessus, ou copier les fichiers source du dossier "src" de. Java Project dans le dossier "src" du projet Android Library. Construisez le projet de bibliothèque Android. Ensuite, vous pourrez copier le fichier jar du projet Android créé dans le dossier 'libs' du dossier Android car les fichiers de classe qu'il contient ont été compilés pour Davlik VM au lieu du fichier Java VM lorsque le projet Android a été construit. Cela permet aux fichiers de classe Java contenus dans le fichier jar de la bibliothèque Android de passer à la résolution lors de la création du projet .apk. Désormais, lorsque l'application sera exécutée, les classes de projet Java seront trouvées à la place d'une erreur Java.lang.NoClassDefFoundError.

18

Essayez d'aller dans Projet -> Propriétés -> Chemin de construction Java -> Ordre et exportation et assurez-vous que les bibliothèques privées Android sont cochées pour votre projet et pour tous les autres projets de bibliothèque que vous utilisez. J'ai eu la solution en suivant le lien ci-dessous NoClassDefFoundError Android Project ?

17
samm

Juste au cas où cela aiderait quelqu'un, je ferais face au même problème. Mon fichier jar se trouvait dans le répertoire libs et le fichier jar a été ajouté au chemin de génération. Il lançait toujours cette exception.

Je viens de nettoyer le projet et cela a fonctionné pour moi.

Eclipse -> Projet -> Nettoyer -> Sélectionner le projet et le nettoyer

8
Souvik Ghosh

J'ai essayé toutes les solutions ci-dessus mais je n'ai pas trouvé de solution,

7
DD.

Cette erreur est également générée lorsque vous créez une application qui utilise l'API Google (telle que Cartes) mais l'exécutez sur un appareil qui cible l'API Android. 

6
T. Markle

J'ai rencontré cette erreur NoClassDefFoundError lorsque j'ai utilisé Java.nio.charset.StandardCharsets. 

La raison en est que StandardCharsets n’existait pas avant JRE 1.7. Si je mets la version 1.7 de la compilation Java à la version 1.7, Eclipse s'est plaint que "Android requiert le niveau de conformité du compilateur 5.0 ou 6.0". Donc, je l'ai corrigé en faisant un clic droit sur le nom du projet -> Outils Android -> Propriétés du projet de réparation. Il est compilé avec JRE1.6.

Cependant, parce que StandardCharsets n’existait pas avant le 1.7. Il a signalé NoClassDefFoundError quand je l'ai exécuté.

Je ne me suis pas rendu compte de cela avant d’avoir essayé beaucoup d’autres méthodes, y compris la réinstallation de JDK. La vraie raison est clairement expliquée par la signification de NoClassDefFoundError: La classe n’est pas trouvée au moment de l’exécution, même si elle a passé la compilation. 

La conclusion générale est que tant qu'Android ne fonctionne pas avec JRE 1.7, si vous utilisez une nouvelle fonctionnalité fournie depuis la version 1.7, vous rencontrerez cette erreur.

Ma solution est que j'ai copié ce code source dans mon code! 

5
gm2008

La description NoClassDefFoundError est, à partir de la balise SO:

Erreur Java générée si la machine virtuelle Java ou un chargeur de classe instance tente de charger la définition d'une classe (dans le cadre d'un appel de méthode normal ou dans le cadre de la création d'une nouvelle instance à l'aide de la nouvelle expression ) et aucune définition de la classe n'a pu être trouvée. Le La définition de classe recherchée existait lors de l'exécution de La classe a été compilée, mais la définition est introuvable.

Ou mieux:

NoClassDefFoundError en Java survient lorsque la machine virtuelle Java n'est pas capable de trouver une classe particulière au moment de l'exécution qui était disponible pendant temps de compilation.

de this page. Vérifiez, il y a quelques façons de résoudre l'erreur. J'espère que ça aide.

4
Alberto Solano

Dans mon cas, j’essayais d’ajouter une classe Java normale (d’un projet Java normal) compilée avec jre 1.7 à un projet d’application Android compilé avec jre 1.7.

La solution consistait à recompiler cette classe Java normale avec jre 1.6 et à ajouter des références au projet d'application Android (compilé avec jre 1.6 également), comme d'habitude (dans l'ordre de tabulation et l'exportation, vérifiez bien la classe, le projet, etc.).

Le même processus, lorsque vous utilisez une bibliothèque Android pour référencer des classes Java normales externes.

Je ne sais pas ce qui ne va pas avec jre 1.7 lors de la compilation de classes Java normales à partir d'un projet Java normal et essayez de les référencer dans des projets d'application ou de bibliothèque Android.

Si vous n'utilisez pas de classes Java normales (d'un projet Java normal), il n'est pas nécessaire de rétrograder à jre 1.6.

3
cfc

Pour moi, ce problème était lié à l’API que j’utilisais n’était pas déployée. Par exemple, j'ai utilisé un ZSDK_API.jar comme référence.

Pour résoudre le problème, je devais faire un clic droit sur le projet et sélectionner les propriétés. De Java BUILD PATH, je devais ajouter l'API qui n'était pas déployée. C'était étrange car l'application lançait la classe MainActivity non trouvée et en réalité, l'erreur était due à l'absence de la classe DiscoveryHandler.

J'espère que cela aide quelqu'un.

3
Tomasz

Sur Android Studio:

1) Ajouter multiDexEnabled = true dans votre configuration default

2) Add compile com.Android.support:multidex:1.0.0 dans vos dependencies

3) Application class étendre MultiDexApplication au lieu de simplement Application

2
Fred Sousa

J'ai rencontré NoClassDefFoundError pour une classe existant dans mon projet (pas une classe de bibliothèque). La classe existe mais j'ai eu NoClassDefFoundError. Dans mon cas, le problème était le support multidex. Le problème et la solution se trouvent ici: Multidex Android et bibliothèques de support

Vous obtenez cette erreur pour les versions Android inférieures à 5.0. 

2
Murat

Autre idée… .. Par exemple, vous avez une classe dérivée de «Android.support.v4.app.Fragment».

Cependant, vous avez commis une erreur et l'avez héritée de "Android.app.Fragment". Ensuite, vous aurez cette erreur sur les appareils Android 2.

1
Manushin Igor

Je suppose que vous ne spécifiez pas la cible de javac lors de la création de la bibliothèque commune, donc javac utilise automatiquement la dernière cible disponible, qui est probablement 1.7 (Java7) ou 1.8 (Java8).

Il a déjà été dit que

Android requiert le niveau de conformité du compilateur 5.0 ou 6.0

dx des outils de génération d'Android <19.0.0 n'est pas en mesure de convertir le bytecode Java7 (ou supérieur) en Daltik bytecode.

Vous pouvez donc utiliser une version>> 19.0.0 ou utiliser javac avec -target 6 , en modifiant par exemple votre ant build.xml comme ceci:

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

Je viens de comprendre quelque chose avec cette erreur.

Assurez-vous simplement que le fichier JAR de la bibliothèque contient la classe R compilée dans le package Android.support.v7.appcompat et copiez toutes les résolutions dans le "projet" de support d'appcompat v7 dans votre dossier Android_SDK_HOME/extras/Android/support/v7/appcompat.

J'utilise Netbeans avec le plugin Android et cela a résolu mon problème.

1
Marthinus Botha

Si rien de ce qui précède ne fonctionne (comme cela m'est arrivé) et que vous utilisez comme bibliothèque un autre projet dans Eclipse.

Faites ceci: Faites un clic droit sur projet -> Propriétés -> Android -> Bibliothèque -> Ajouter

C'est ce qui m'est arrivé! Ajout d'un projet en tant que bibliothèque (Propriétés du projet)

0
Feiteira

jars se trouvaient dans le dossier lib /, maintenant ils le sont dans libs / Si vous utilisez lib, vous pouvez les déplacer de lib en lib et supprimer les dépendances des propriétés du projet/chemin de génération Java, car Android trouvez-les automatiquement.

0
Christine

Solutions:

  1. Élément de liste
  2. Vérifier les commandes d'exportation
  3. Activer Multi Dex
  4. Vérifiez le niveau des vues dans la mise en page. J'ai rencontré le même problème avec searchView. J'ai vérifier le niveau d'api lors de l'ajout de searchview mais ajouté implémente SearchView.OnQueryTextListener dans un fichier de classe.
0

Activité à nouveau ajoutée au manifeste.J'ai essayé dans mon manifeste puis l'application a fonctionné.

 <activity
        Android:name="com.xxx.xxx.MainActivity"
0
devcelebi

Pour moi, le problème était que la bibliothèque référencée avait été construite avec Java 7. Je l'ai résolu en reconstruisant à l'aide du JDK 1.6.

0
theannouncer

J'ai résolu ce problème en ajoutant manuellement le chemin du projet de bibliothèque dans project.propertied. quelques comment Eclipse n'a pas ajouté cette entrée automatiquement avec "add project". Donc, le point où l'application essayait de référencer un composant dans le projet lib était en train de planter.

vous pouvez aussi essayer la même chose. dépendance de l'application dans projec.properties comme

Android.library.reference.1 = ....\Android-sdks\options\google\google_play_services\libproject/google-play-services_lib

et courir .

Quelque temps, Java.lang.NoClassDefFoundError: une erreur apparaît lors de l'utilisation de ART au lieu de l'exécution de Dalvik. Pour changer le runtime, allez simplement dans Developer Option -> Select Runtime -> Dalvik.

0

Essayez d'aller à

  • Projet clic droit
  • Chemin de construction Java
  • La source
  • côté droit -> bouton Ajouter un dossier
  • dossier libs sélectionné et OK

J'espère que ça aide.

0
zxbin