it-swarm.com.de

Android Activity ClassNotFoundException - alles ausprobiert

Ich habe gerade eine App in eine Framework-Bibliothek und eine Anwendung überarbeitet, aber jetzt, wenn ich versuche, die App im Emulator zu starten, erhalte ich den folgenden Fehler-Stack-Trace:

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

Normalerweise bedeutet dies, dass die Manifestdatei in irgendeiner Weise falsch ist, aber ich habe alles, was mir einfällt, zweimal überprüft.

Hier ist meine Aktivitätsklasse:

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;
        }
       };
      }
    }

Wie Sie sehen, ist es im Manifest korrekt aufgeführt:

<?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>

Ich habe keine Ahnung, wie ich das beheben soll, und würde mich über jede Hilfe freuen. Ich habe viele ähnliche Fragen zu SO) gescannt, ohne dieses spezielle Verhalten zu bemerken.

Mehr Info:

  • Ich habe die generierte APK überprüft und die Klasse hat einen Eintrag in der classes.dex-Datei
  • Ich habe versucht, das Projekt in Eclipse zu bereinigen/aufzubauen
  • Ich habe versucht, ein völlig neues Geräte-Image zu verwenden, auf dem noch keine Kopie der APK vorhanden ist
  • Ich habe das Bibliotheksprojekt in ein reguläres Java-Projekt und dann wieder in ein Android Projekt geändert, kein Unterschied
  • Das Hinzufügen der abstrakten SimonSaysActivity zum Manifest macht keinen Unterschied.
  • Ich habe versucht, jede Abhängigkeit zu einem Android Bibliotheksprojekt zu machen und die benötigte Android Version zu synchronisieren, es hat nicht geholfen

Die Lösung gefunden (siehe unten). An alle, die eine Antwort/einen Kommentar gepostet haben: Ihr alle rockt, danke, dass ihr mir geholfen habt, die Probleme zu lösen!

Sieht so aus, als würde dies durch ein SDK-Tool-Upgrade eingeführt. Vielen Dank an @Nick in den Kommentaren zu diesem Link: http://iqadd.com/item/noclassdeffounderror-adt-fix

80

Ich habe einige Zeit mit meinem eigenen Projekt verbracht und bin in der Lage, Ihr Problem zu replizieren und genau den gleichen Ausnahmestapel-Trace zu erhalten, wenn ich versuche, mein Hauptprojekt auszuführen. Daher denke ich, dass dies die Ursache sein könnte:

Genau wie ich es mir vorgestellt habe, dreht sich alles darum, wie Sie auf Ihr Android= Bibliotheksprojekt im Android= Hauptprojekt, eine einfache Eclipse-Konfigurationseinstellung, verweisen.

Der falsche Weg:
Klicken Sie mit der rechten Maustaste auf das Hauptprojekt und wählen Sie Properties -> Java Build Path -> Projects -> Add..., fügen Sie das Bibliotheksprojekt Android als Abhängigkeitsprojekt in Android Hauptprojekterstellungspfad hinzu, dies funktioniert nicht. Wenn alle erforderlichen Android-bezogenen Ressourcen vorhanden sind Wenn Sie im Hauptprojekt definiert sind, wird beim Kompilieren kein Fehler angezeigt. Beim Ausführen der Anwendung wird jedoch die in der Frage beschriebene Ausnahme angezeigt.

Der richtige Weg:
Klicken Sie mit der rechten Maustaste auf das Hauptprojekt und wählen Sie Properties -> Android Fügen Sie im Abschnitt Bibliothek Ihr Android Bibliotheksprojekt hier hinzu. Lesen Sie den offiziellen Entwicklerleitfaden Referenzieren eines Bibliotheksprojekts . Dies sollte Ihr gesamtes Problem beheben. Beachten Sie auch dass Sie einen relativen Pfadverweis auf das tatsächliche Android Bibliotheksprojekt verwenden müssen, wie in den Bibliotheksprojekt - Entwicklungsüberlegungen angegeben.

Hoffe das hilft.

147
yorkw

ich habe den Code getestet, den Sie gegeben haben, und es funktioniert gut. Ändern Sie die Option "Erweitert SimonSaysActivity" in "Erweitert Activity" und überzeugen Sie sich selbst, dass sie funktioniert.

der Grund, warum es nicht funktioniert, ist, dass SimonSaysActivity die Aktivität nicht erweitert (was ich nicht glaube, dass Sie diesen Fehler begangen haben), oder die Reihenfolge des Erstellungspfads ist falsch.

um zur Reihenfolge des Erstellungspfads zu gelangen, gehen Sie zu:

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

meine grundlegende Reihenfolge ist: Projekt src, Projekt gen, Android 4.0.3, Android Abhängigkeiten.

dieses Problem tritt normalerweise auf, wenn Sie Bibliotheken verwenden.

8

Ich habe gerade eine App in eine Framework-Bibliothek und eine Anwendung überarbeitet.

Ich bin mir nicht ganz sicher, was Sie hier sagen wollen, aber die Tatsache, dass Sie das Wort "refactored" verwendet haben, lässt mich glauben, dass Sie das Konzept eines Bibliotheksprojekts missverstehen.


Welche Bibliotheksprojekte sind:

Ein Bibliotheksprojekt ist ein Entwicklungsprojekt, das gemeinsam genutzten Quellcode und Ressourcen enthält. Andere Android Projekte können auf das Bibliotheksprojekt verweisen und seine kompilierten Quellen zur Kompilierungszeit in ihre .apk-Dateien aufnehmen.

Welche Bibliotheksprojekte sind nicht:

Ein Bibliotheksprojekt unterscheidet sich von einem Android Standardprojekt dadurch, dass Sie es nicht direkt in eine einzelne .apk - Datei kompilieren und auf einem Android Gerät ausführen können. Sie können ein Android -Projekt nicht als Bibliotheksprojekt verwenden und anschließend ein anderes Android -Projekt erweitern das Bibliotheksprojekt. So funktioniert das nicht.


Trotzdem würde ich die Struktur Ihres Bibliotheksprojekts untersuchen und sicherstellen, dass Sie richtig eingerichtet . Es ist in Ordnung, Ihre Bibliothek zum Speichern von gemeinsam genutztem Code/gemeinsam genutzten Ressourcen zu verwenden. Wenn Ihre Bibliothek jedoch versucht, sich so zu verhalten, als wäre es ein separates .apk Im Bibliotheksprojekt selbst, haben Sie wahrscheinlich etwas falsch gemacht. Ich glaube, ein ClassNotFoundException würde geworfen, wenn dies der Fall wäre. Um das Problem zu beheben, würde ich das Bibliotheksprojekt einfach von Grund auf neu erstellen, anstatt zu versuchen, das Projekt Android in ein Bibliotheksprojekt zu konvertieren. Das verhindert, dass Sie auf winzige, nervige Fehler stoßen.

Wenn Sie immer noch Probleme haben, können Sie gerne weiteren Code posten. Sie sollten auch die Struktur (und den Zweck) Ihres Bibliotheksprojekts etwas genauer erläutern ... warum Sie sich für eine entschieden haben, wie Sie sie erstellt haben usw.

2
Alex Lockwood

Für Eclipse Kepler (Mac): Klicken Sie bei gedrückter Ctrl-Taste auf Projekt -> Android Tools -> Unterstützungsbibliothek hinzufügen

2
PSchuette

Ich hatte dieses Problem mit einem Projekt, an dem ich arbeitete, obwohl mein Fall anders war. Wenn irgendjemand da draußen immer noch keine Lösung für sein Problem finden kann, versuchen Sie Folgendes:

In Eclipse:

Project properties -> Java Build Path -> Source tab

Im Inneren finden Sie eine Liste mit allen Quellordnern, die jedes Mal kompiliert und in die generierte apk eingefügt werden müssen, um Ihr Projekt zu erstellen (und / gen). Typisch:

>MyProject/gen
>MyProject/src

Was Sie sicher sein wollen, ist, dass in jedem Ihrer Quellordner (ausschließen / genalso nur / src In diesem Fall wird das Element Output folder in den Standardausgabeordner kopiert, der MyProject/bin/classes lautet. Wählen Sie dazu den Ausgabeordner aus und klicken Sie in der rechten Gruppe von Schaltflächen auf Entfernen (dadurch wird auf den Standardordner verwiesen).

Wenn Sie den Unterpunkt Ausgabeordner nicht sehen können, markieren Sie "Ausgabeordner für Quellordner zulassen" direkt unterhalb der Liste

2
Gonzalo

entferne classes.dex aus dem Bin und baue das Projekt neu auf

1
Afzaal Iftikhar

Dies gilt zwar nicht für alle, aber ich hatte kürzlich dieses Problem, weil mein Projekt keine Verknüpfung mit einer auf dem Gerät vorhandenen gemeinsam genutzten Bibliothek herstellen konnte. Ich hatte vergessen, in meinem Manifest anzugeben dass mein Antrag <uses-library>.

1
lase

classNotFoundException in Java ist eine Unterklasse von Java.lang.Exception und wird ausgeführt, wenn Java= Virtual Machine versucht, eine bestimmte Klasse zu laden und die angeforderte Klasse nicht gefunden hat im Klassenweg.

Lesen Sie mehr: http://javarevisited.blogspot.com/2011/08/classnotfoundexception-in-Java-example.html#ixzz3yX3WBeFA

Gehen Sie zu Project -> Properties -> Java Build Path -> Order & Export und Bestätigen Sie Android Private Libraries werden für Ihr Projekt und für alle anderen Bibliotheksprojekte überprüft, die Sie in Ihrer Anwendung verwenden.

Umgang mit der ClassNotFoundException

  1. Stellen Sie sicher, dass der Name der angeforderten Klasse korrekt ist und dass die entsprechende .jar-Datei in Ihrem Klassenpfad vorhanden ist. Andernfalls müssen Sie es explizit zum Klassenpfad Ihrer Anwendung hinzufügen.
  2. Falls die angegebene .jar-Datei in Ihrem Klassenpfad vorhanden ist, wird der Klassenpfad Ihrer Anwendung überschrieben und Sie müssen den genauen Klassenpfad ermitteln, der von Ihrer Anwendung verwendet wird.
  3. Wenn die Ausnahme von einer Klasse eines Drittanbieters verursacht wird, müssen Sie die Klasse identifizieren, die die Ausnahme auslöst, und anschließend die fehlenden . Jar-Dateien in Ihre hinzufügen Klassenpfad.
1
IntelliJ Amiya

die von @yorkw bereitgestellte Lösung ist absolut korrekt. Ich hatte ein zusätzliches Problem, in einer der Layoutdateien hatte ich den absoluten Namen falsch angegeben. Es hätte sein sollen

<Android.support.v4.view.ViewPager xmlns:Android="...

eher hatte ich es gesagt

<Android.support.v4.app.view.ViewPager xmlns:Android="...

nachdem diese behoben wurden, funktionierte es gut.

0
Himadri Pant

Ob Sie es glauben oder nicht, das Problem bestand für mich darin, die alte Version (2.0) der Google Analytics-Bibliothek aus meinem Projekt zu entfernen, nachdem Sie alles mindestens 4 Stunden lang ausprobiert hatten. Natürlich könnte auch ein Update dieser Bibliothek die Lösung sein. Es könnte sich also um ein Problem bei der Versionierung von Abhängigkeitsgläsern handeln.

0
Criss

Ich hatte das gleiche Problem und verschwendete den größten Teil des Tages damit, alle möglichen Dinge auszuprobieren. Die App lief find bei der Bereitstellung von einem PC, aber nicht auf diesem einen PC. Am Ende war es eine fehlende Java Natur! Seltsam, wie es mir gezeigt hat Java Pfade bauen, bestellen/exportieren und all das, aber noch nicht Habe eine Java nature. :( Hoffe das spart jemand anderem viel Zeit

0
Luke

Welche Schnittstellen oder übergeordneten Klassen verwendet/erweitert SimonSaysActivity und sind diese in der von Ihnen verwendeten Version von Android) verfügbar? Ich habe ähnliche Probleme festgestellt, bei denen meine Aktivität eine API-Schnittstelle implementiert hat, die nicht vorhanden war verfügbar in der Version von Android Ich habe verwendet.

In meinem Fall hat meine Aktivität die Schnittstelle PopupMenu.OnDismissListener implementiert, die nur in API 14 verfügbar ist. Als ich die App auf meinem 2.3-Gerät ausführte, erhielt ich jedoch eine Java.lang.NoClassDefFoundError-Ausnahme für die Aktivität.

0
Charles Harley

Wenn Sie alle Hinweise befolgt haben (überprüft die privaten Bibliotheken usw.) und immer noch den Fehler haben. Überprüfen Sie Ihr Manifest auf diese Codezeile im Application-Tag

    Android:hasCode="false" 

Entferne es und sei glücklich. (War ich endlich) :)

0
Corona