75 votes

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

Je rencontre une erreur assez fréquente chez mes utilisateurs. L'application se bloque au démarrage. Lorsque la MainActivity est censée être chargée, la VM ne trouve apparemment pas la classe. Je n'arrive pas à comprendre pourquoi. L'architecture de l'application est qu'il y a un projet commun que ma version gratuite et ma version pro utilisent toutes les deux. Je ne sais pas si cela est pertinent. Voir la trace de la pile ci-dessous. Avez-vous des idé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 à quelque chose d'autre. Ce n'était pas le vrai nom de classe de toute façon. C'est ma faute... !

125voto

Sabo Points 1027

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 "Java Build Path".
  3. Sélectionnez l'onglet "Commande et exportation".
  4. Vous devriez voir les chemins et les dépendances "src" et "gen" du projet sélectionné ici.
  5. L'ordre dans lequel ils sont listés est d'abord "src" puis "gen" path.
  6. Je les ai intervertis, de sorte que le dossier "gen" soit construit avant le dossier "src".

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

Il n'a pas été nécessaire de redémarrer l'Eclipse. Il a simplement commencé à fonctionner.

Honnêtement, je n'ai jamais essayé "Android Tools > Fix Project Properties", il se peut que cela fasse la même chose. Je ne sais pas, j'ai juste fait ce qui précède après avoir vu le message d'erreur, pensant que quelque chose ne va pas avec les chemins de construction.


Modifier


Plus tard, cela n'a pas suffi, je recevais à nouveau l'erreur. J'ai alors "vérifié" toutes les dépendances listées dans cette vue. Maintenant, cela fonctionne à nouveau. Jusqu'à présent, tout va bien. Je tiendrai ce message à jour si cela échoue à nouveau.

FYI : dans ma dernière tentative, j'ai essayé "Android Tools > Fix Project Properties", mais cela n'a pas fonctionné pour moi.

18voto

J'utilise actuellement le SDK 20.0.3 et aucune des solutions précédentes n'a fonctionné pour moi.

J'ai réussi à faire fonctionner les choses en

  • Clic droit sur le projet Android
  • Sélectionnez ensuite Build Path -> Link Source pour faire apparaître la boîte de dialogue Link Source.
  • Ensuite, j'ai spécifié le dossier 'src' du projet Java et je lui ai donné un nom autre que le nom par défaut 'src' (par exemple 'src2').
  • Vous pouvez maintenant faire un clic droit -> supprimer le nouveau dossier 'src2'.

Cela a permis de créer des fichiers de classe Java qui ont été compilés pour la VM Dalvik au lieu de la VM Java lorsque le projet Android a été construit. Cela a permis aux fichiers de classe Java dans le fichier jar de la bibliothèque Android de passer par le dexing lorsque le projet Android .apk a été créé. Maintenant, lorsque l'application est exécutée, les classes du projet Java sont trouvées au lieu d'une erreur Java.lang.NoClassDefFoundError.

Si vous souhaitez utiliser un fichier jar au lieu de lier la source, vous devrez créer un projet Android Library. (Un projet Android dont la case "is library" est cochée dans Propriétés -> Android.) Vous devrez ensuite soit lier la source du projet Java au projet Android Library comme décrit ci-dessus, soit copier les fichiers sources du dossier "src" du projet Java vers le dossier "src" du projet Android Library. Construisez le projet Android Library. Vous pourrez alors copier le fichier jar du projet Android qui a été créé dans le dossier 'libs' du dossier Android parce que les fichiers de classe qu'il contient ont été compilés pour la VM Davlik au lieu de la VM Java lorsque le projet Android a été construit. Cela permet aux fichiers de classe Java dans le fichier jar de la bibliothèque Android de passer par le dexing lorsque le projet Android .apk est créé. Maintenant, lorsque l'application est lancée, les classes du projet Java seront trouvées au lieu d'une erreur Java.lang.NoClassDefFoundError.

17voto

G.k. Points 380

Essayez d'aller dans Project -> Properties -> Java Build Path -> Order & Export et assurez-vous que Android Private Libraries est coché pour votre projet et pour tous les autres projets de bibliothèque que vous utilisez. J'ai obtenu la solution en suivant le lien ci-dessous NoClassDefFoundError Projet Android ?

8voto

Souvik Ghosh Points 73

Au cas où cela aiderait quelqu'un, j'ai rencontré le même problème. Mon fichier jar se trouvait dans le répertoire libs et le jar a été ajouté au chemin de construction. Pourtant, l'exception est toujours présente.

Je viens de nettoyer le projet et ça a marché pour moi.

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

7voto

DD. Points 611

J'ai essayé toutes les solutions mentionnées ci-dessus mais cela n'a pas fonctionné pour moi, Voici ce que j'ai fait pour y arriver projet-> config build path-> ordonner et exporter-> déplacer le projet dépendant au dessus

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X