85 votes

Activité Android ClassNotFoundException - tout essayé

Je viens de refactoring d'une application dans un cadre de référence de la bibliothèque et de la demande, mais maintenant, quand j'essaie de démarrer l'application dans l'émulateur j'obtiens l'erreur suivante trace de la pile:

06-02 18:22:35.529: E/AndroidRuntime(586): FATAL EXCEPTION: main
06-02 18:22:35.529: E/AndroidRuntime(586): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.matthewrathbone.eastersays/com.matthewrathbone.eastersays.EasterSimonSaysActivity}: java.lang.ClassNotFoundException: com.matthewrathbone.eastersays.EasterSimonSaysActivity in loader dalvik.system.PathClassLoader[/data/app/com.matthewrathbone.eastersays-1.apk]
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.os.Looper.loop(Looper.java:123)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread.main(ActivityThread.java:4627)
06-02 18:22:35.529: E/AndroidRuntime(586):  at java.lang.reflect.Method.invokeNative(Native Method)
06-02 18:22:35.529: E/AndroidRuntime(586):  at java.lang.reflect.Method.invoke(Method.java:521)
06-02 18:22:35.529: E/AndroidRuntime(586):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-02 18:22:35.529: E/AndroidRuntime(586):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-02 18:22:35.529: E/AndroidRuntime(586):  at dalvik.system.NativeStart.main(Native Method)
06-02 18:22:35.529: E/AndroidRuntime(586): Caused by: java.lang.ClassNotFoundException: com.matthewrathbone.eastersays.EasterSimonSaysActivity in loader dalvik.system.PathClassLoader[/data/app/com.matthewrathbone.eastersays-1.apk]
06-02 18:22:35.529: E/AndroidRuntime(586):  at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
06-02 18:22:35.529: E/AndroidRuntime(586):  at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
06-02 18:22:35.529: E/AndroidRuntime(586):  at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
06-02 18:22:35.529: E/AndroidRuntime(586):  ... 11 more

Habituellement, cela signifie que le fichier manifeste est mal dans un certain sens, mais j'ai vérifié tout ce que je pense de.

Voici ma classe d'activité:

package com.matthewrathbone.eastersays;

import android.os.Bundle;

import com.rathboma.simonsays.Assets.Season;
import com.rathboma.simonsays.SeasonPicker;
import com.rathboma.simonsays.SimonSaysActivity;

    public class EasterSimonSaysActivity extends SimonSaysActivity {

      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
      }

      @Override
      protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
      }

      @Override
      public SeasonPicker getSeasonPicker() {
       return new SeasonPicker(){
        @Override
        public Season getSeason() {
          // TODO Auto-generated method stub
          return Season.EASTER;
        }
       };
      }
    }

Comme vous pouvez le voir, il est inscrit correctement dans le manifeste:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.matthewrathbone.eastersays"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".EasterSimonSaysActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Je n'ai aucune idée de comment résoudre ce problème, et serais reconnaissant de toute aide. J'ai scanné beaucoup de questions similaires sur DONC sans voir ce comportement particulier.

Plus d'infos:

  • J'ai vérifié à l'intérieur de l'généré APK et la classe dispose d'une entrée dans les classes.dex fichier
  • J'ai essayé le nettoyage/la construction du projet dans eclipse
  • J'ai essayé à l'aide d'une toute nouvelle image de l'appareil qui n'a pas une copie de l'APK sur elle déjà
  • J'ai modifié le projet de bibliothèque en un java ordinaire, puis a changé de retour dans un projet android, pas de différence
  • L'ajout de l'abstrait SimonSaysActivity pour le manifeste ne fait aucune différence.
  • J'ai essayé de faire toutes les dépendances d'un android bibliothèque de projet, et la synchronisation de la version d'android qu'ils exigent, il n'a pas aidé

Trouvé la solution (voir ci-dessous). Pour tout le monde qui a posté une réponse / commentaire: Vous tous rock, merci de m'aider à travailler à travers les problèmes!

Regarde comme il est introduit par un SDK outils de mise à niveau. Grâce à @Nick ci-dessous dans les commentaires de ce lien: http://iqadd.com/item/noclassdeffounderror-adt-fix

148voto

yorkw Points 24676

J'ai passé du temps à jouer avec mon propre projet, et je suis capable de reproduire votre problème et obtenir exactement la même trace de pile d'exception lors de l'exécution de mon projet principal, donc je pense que cela pourrait être la cause:

Tout comme ce que je pensais, il est tout au sujet de la façon dont vous faites référence à votre Android projet de bibliothèque dans l'Android de projet principal, une simple Éclipse les paramètres de configuration.

La Mauvaise Façon:
Cliquez-droit sur le projet principal, choisissez Properties -> Java Build Path -> Projects -> Add..., ce complément Android Projet de bibliothèque en tant que dépendance de projet dans Android principal projet de construction de chemin, cela ne fonctionne pas. Si tous les Android-ressources connexes sont définis dans le projet principal, vous n'aurez aucune erreur lors de la compilation, mais lors de l'exécution de l'application, vous obtenez l'exception décrite dans la question.

La Façon Correcte:
Cliquez-droit sur le projet principal, choisissez Properties -> Android, dans la section de la Bibliothèque, ajouter votre Android projet de bibliothèque ici. Découvrez officielle dev guide de Référencement d'un projet de bibliothèque. Cela devrait résoudre tous vos problème. Notez également que vous devez utiliser un chemin relatif de référence de la réelle Android bibliothèque de projet, comme indiqué dans le Projet de Bibliothèque - les questions de Développement.

Espérons que cette aide.

8voto

android developer Points 20939

j'ai testé le code que vous avez donné , et il fonctionne très bien. essayez de changer de "s'étend SimonSaysActivity" simplement "s'étend de l'Activité" et vous verrez que cela fonctionne .

la raison qu'il ne fonctionne pas est soit SimonSaysActivity ne s'étendent pas à l'Activité (dont je ne pense pas que vous avez fait cette erreur) , ou de l'ordre de la construction de chemin d'accès est incorrect .

pour aller à la commande de la construction du chemin , allez à :

project->properties->Java build path->order and export .

mon ordre de base est : le projet de la src , le projet gen , android 4.0.3 , android dépendances .

ce problème se produit généralement lorsque vous utilisez des bibliothèques .

2voto

Alex Lockwood Points 31578

Je viens de refactoring d'une application dans un cadre de référence de la bibliothèque et de la demande.

Je ne suis pas entièrement sûr de ce que vous essayez de dire ici, mais le fait que vous avez utilisé le mot "remaniée" ici, m'amène à croire que vous êtes l'incompréhension de la notion de bibliothèque de projet.


Quels projets de la bibliothèque sont:

Un projet de bibliothèque est un projet de développement qui contient le code source partagé et des ressources. Android d'autres projets peuvent faire référence à la bibliothèque de projet et comprendre ses sources compilées dans leur .apk fichiers au moment de la compilation.

Quels projets de bibliothèque ne sont pas:

Un projet de bibliothèque diffère en standard d'un projet Android en que vous ne pouvez pas compiler directement à un seul .apk fichier et de l'exécuter sur un appareil Android. Vous ne pouvez pas utiliser un Android des projets comme un projet de bibliothèque, et alors un autre projet Android étendre le projet d'une bibliothèque. Il ne fonctionne pas de cette façon.


Cela dit, je voudrais étudier la structure de votre projet de bibliothèque et de s'assurer que vous avez configuré correctement. C'est OK pour utiliser votre bibliothèque pour stocker le code partagé des ressources, mais si votre bibliothèque est d'essayer de se comporter comme si elle était séparée .apk dans le projet de bibliothèque de lui-même, alors vous avez probablement fait quelque chose de mal. Je crois qu'un ClassNotFoundException pourrait être levée si c'était le cas. Pour résoudre le problème, je venais tout juste de créer le projet de bibliothèque à partir de zéro, plutôt que d'essayer de convertir le projet Android à un projet de bibliothèque. Qui va vous empêcher de courir dans de minuscules, des bugs gênants.

N'hésitez pas à poster plus de code si vous rencontrez toujours des problèmes. Vous devez également élaborer un peu plus sur la structure (et le but) de votre projet de bibliothèque... pourquoi vous avez décidé de l'utilisation, la façon dont vous l'avez créé, etc.

2voto

Gonzalo Points 404

J'ai eu ce problème avec un projet sur lequel je travaillais, si mon cas était différent. Si quelqu'un là ne pouvez toujours pas trouver la solution à leur problème, essayez ceci:

Dans Eclipse:

Project properties -> Java Build Path -> Source tab

A l'intérieur vous trouverez une liste de tous les dossiers source de compiler et de mettre en générés apk chaque temps de construire votre projet (et /gen). Typiquement:

>MyProject/gen
>MyProject/src

Ce que vous voulez être sûr, c'est qu'à l'intérieur de chacun de vos dossiers de la source (à l'exclusion de /gen, donc seulement /src dans ce cas), l'élément Output folder est poiting pour le dossier de sortie par défaut, qui est - MyProject/bin/classes. Pour ce faire, sélectionnez le dossier de Sortie et en cliquant sur Supprimer à partir de la série de boutons (ce qui permettra de faire le point sur le dossier par défaut).

Si vous ne pouvez pas voir le paragraphe dossier de Sortie, cochez la case "Autoriser la sortie des dossiers pour les dossiers de la source" juste en dessous de la liste

2voto

PSchuette Points 2109

Pour Eclipse Kepler (Mac): Contrôle-cliquez sur projet -> Outils Android -> ajouter une bibliothèque de support.

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