NoClassDefFoundError für Code in einer Java-Bibliothek unter Android

77

Bei meinen Benutzern tritt häufig ein Fehler auf. Die App stürzt beim Start ab. Wenn die MainActivity geladen werden soll, kann die VM die Klasse anscheinend nicht finden. Ich kann nicht herausfinden warum. Die Architektur der App ist, dass es ein gemeinsames Projekt gibt, das sowohl meine kostenlose als auch meine Pro-Version verwenden. Ich weiß nicht, ob es relevant ist. Siehe die Stapelverfolgung unten. Irgendwelche Gedanken?

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: Danke für den Kommentar unten, Richard. Jetzt habe ich com.android.Splashzu etwas anderem gewechselt . Es war sowieso nicht der richtige Klassenname. Mein Fehler...!

kjoelbro
quelle
3
Warum sollten Sie jemals versuchen, eine Klasse in einem bereits vorhandenen Paket zu erstellen? ( com.android.*). Das ist eine schlechte Form, versuchen Sie das Paket zu ändern.
Richard J. Ross III
2
Kommt das nur manchmal vor? oder passiert es die ganze Zeit, wenn Sie lokal bauen?
David T.
2
Dies geschah nur für die App, die zum Spielen gestartet wurde. Ich habe es selbst nicht gesehen, also habe ich gerade die Stapelverfolgung gesehen, die bei Crittercism abgerufen wurde.
Kjoelbro

Antworten:

125

Ich hatte das gleiche Problem. Ich habe Folgendes getan, um das Problem zu beheben.

  1. Gehen Sie zu "Eigenschaften" des Projekts.
  2. Wählen Sie "Java Build Path"
  3. Wählen Sie die Registerkarte "Bestellen und Exportieren"
  4. Hier sollten die Pfade und Abhängigkeiten "src" und "gen" des ausgewählten Projekts angezeigt werden.
  5. Die Reihenfolge, in der sie aufgelistet wurden, war zuerst "src" und dann "gen"
  6. Ich wechsle sie, so dass der Ordner "gen" vor dem "src" erstellt wird.

gen - automatisierter Code im Projekt (aus Abhängigkeiten und Referenzen)
src - Quellcode im Projekt

Die Eclipse musste nicht neu gestartet werden. Es hat gerade angefangen zu arbeiten.

Ehrlich gesagt habe ich noch nie "Android Tools> Projekteigenschaften korrigieren" ausprobiert, manchmal funktioniert es möglicherweise genauso. Ich weiß nicht, ich habe es gerade oben getan, nachdem ich die Fehlermeldung gesehen habe und dachte, dass etwas mit den Erstellungspfaden nicht stimmt.


Bearbeiten


Später war es nicht ausreichend, ich bekam den Fehler wieder. Dann habe ich alle in dieser Ansicht aufgeführten Abhängigkeiten "überprüft". Jetzt funktioniert es wieder. So weit, ist es gut. Ich werde dies auf dem neuesten Stand halten, wenn es erneut fehlschlägt.

Zu Ihrer Information : Bei meinem letzten Versuch habe ich "Android Tools> Projekteigenschaften korrigieren" ausprobiert, aber es hat für mich nicht funktioniert.

Sabo
quelle
4
Ihre bearbeiteten und haben auch für mich gearbeitet ... ich habe 2-3 Stunden lang an meinen Haaren gezogen, weil ClassDefNotFoundError
Prativa
1
Ich hinterlasse einen Kommentar, den jemand eines Tages finden könnte. Mein Problem bestand darin, auf eine Klasse aus einem Bibliotheksprojekt zu verweisen, die nicht hätte verwendet werden dürfen. Ich habe den Fehler / die Lösung stattdessen auf der Registerkarte "Bibliotheken" gefunden. Ich weiß nicht, ob es jemals jemandem helfen wird, aber jetzt ist es im Internet.
Andreas Rudolph
Ihr Vorschlag, "gen" mit "src" zu wechseln, hat funktioniert, alles andere ist fehlgeschlagen! Vielen Dank!
Knabbereien
Diese Lösung hat bei mir nicht funktioniert. Das Verschieben einer enthaltenen JAR-Datei nach oben hat dies jedoch getan. Dies war für AFreeChart. Generell ist das Ändern der Erstellungsreihenfolge der Teil dieser Antwort, der dieses Problem lösen kann. Der NoClassDefFoundError ist ein schwer auffindbares Problem. Nebenbei: Ich lösche oft gen, um einen Neuaufbau zu bewirken. In diesem Fall wird gen nach unten verschoben. Das war für mich nie ein Problem.
Kenneth Evans
Hier ist noch ein Hit n Versuch, der für mich funktioniert hat ..... folgte den genannten 6 Schritten und wählte dann meine eigenen Bibliotheken (jackson ect) im Tab "Bestellen und Exportieren" aus
Shailendra Singh Rajawat
18

Ich verwende derzeit SDK 20.0.3 und keine der vorherigen Lösungen hat für mich funktioniert.

Ich konnte Dinge zum Laufen bringen

  • Klicken Sie mit der rechten Maustaste auf das Android-Projekt
  • Wählen Sie dann Build Path -> Link Source, um das Dialogfeld Link Source aufzurufen.
  • Dann habe ich den Ordner 'src' des Java-Projekts angegeben und ihm einen anderen Namen als den Standardnamen 'src' gegeben (z. B. 'src2').
  • Sie können jetzt mit der rechten Maustaste klicken -> den neuen Ordner 'src2' löschen.

Dies brachte die erstellten Java-Klassendateien mit sich, die beim Erstellen des Android-Projekts für die Dalvik-VM anstelle der Java-VM kompiliert wurden. Dadurch konnten die Java-Klassendateien in der JAR-Datei der Android-Bibliothek beim Erstellen des Android-Projekts .apk dexiert werden. Als die App ausgeführt wurde, wurden die Java-Projektklassen gefunden, anstatt dass ein Java.lang.NoClassDefFoundError ausgelöst wurde.

Wenn Sie eine JAR-Datei verwenden möchten, anstatt die Quelle zu verknüpfen, müssen Sie ein Android-Bibliotheksprojekt erstellen. (Ein Android-Projekt mit 'Ist Bibliothek' ist in Eigenschaften -> Android aktiviert.) Anschließend müssen Sie entweder die Quelle des Java-Projekts wie oben beschrieben mit dem Android-Bibliotheksprojekt verknüpfen oder die Quelldateien aus dem Ordner 'src' von kopieren das Java-Projekt in den Ordner 'src' des Android Library-Projekts. Erstellen Sie das Android Library-Projekt. Anschließend können Sie die JAR-Datei des Android-Projekts, die erstellt wurde, in den Ordner 'libs' des Android-Ordners kopieren, da die darin enthaltenen Klassendateien beim Erstellen des Android-Projekts für die Davlik-VM anstelle der Java-VM kompiliert wurden. Auf diese Weise können die Java-Klassendateien in der JAR-Datei der Android-Bibliothek beim Erstellen des Android-Projekts .apk dexiert werden.

Danny Remington - OMS
quelle
17

Gehen Sie zu Projekt -> Eigenschaften -> Java-Erstellungspfad -> Bestellen und Exportieren und stellen Sie sicher, dass die privaten Android-Bibliotheken für Ihr Projekt und für alle anderen von Ihnen verwendeten Bibliotheksprojekte aktiviert sind. Ich habe die Lösung erhalten, indem ich dem folgenden Link folge: NoClassDefFoundError Android Project ?

samm
quelle
8

Nur für den Fall, dass es jemandem hilft, stand ich vor dem gleichen Problem. Meine JAR-Datei befand sich im libs-Verzeichnis und das JAR wurde dem Erstellungspfad hinzugefügt. Trotzdem warf es diese Ausnahme.

Ich habe gerade das Projekt gereinigt und es hat bei mir funktioniert.

Eclipse -> Projekt -> Bereinigen -> Wählen Sie das Projekt aus und bereinigen Sie es

Souvik Ghosh
quelle
7

Ich habe alle oben genannten Lösungen ausprobiert, aber für mich nicht funktioniert. Hier ist, was ich getan habe, um es fertig zu stellen. Projekt-> Konfigurationspfad erstellen-> bestellen und exportieren-> abhängiges Projekt nach oben verschieben

DD.
quelle
6

Dieser Fehler wird auch generiert, wenn Sie eine App erstellen, die die Google-API verwendet (z. B. Maps), diese jedoch auf einem Gerät ausführt, das auf die Android-API abzielt.

T. Markle
quelle
1
das hat mein Problem endlich behoben. Irgendwie ändert die Funktion zum Beheben von Projekteigenschaften das Ziel nicht. Ich habe dies behoben, indem ich meine Google API
Boreas am
5

Ich bin auf diesen NoClassDefFoundError gestoßen, als ich java.nio.charset.StandardCharsets verwendet habe.

Der Grund ist, dass StandardCharsets bis JRE 1.7 nicht existiert hat. Wenn ich die Java-Kompilierungsversion auf 1.7 setze, hat sich Eclipse beschwert, dass "Android die Compiler-Konformitätsstufe 5.0 oder 6.0 erfordert". Also habe ich es behoben, indem ich mit der rechten Maustaste auf den Projektnamen-> Android Tools-> Fix Project Properties geklickt habe. Es ist mit JRE1.6 kompiliert.

Da StandardCharsets jedoch erst ab 1.7 vorhanden waren. Es hat NoClassDefFoundError gemeldet, als ich es ausgeführt habe.

Ich habe dies erst erkannt, nachdem ich viele andere Methoden ausprobiert hatte, einschließlich der Neuinstallation von JDK. Der wahre Grund wird durch die Bedeutung von NoClassDefFoundError deutlich: Die Klasse kann zur Laufzeit nicht gefunden werden, obwohl sie die Kompilierung bestanden hat.

Die allgemeine Schlussfolgerung lautet, dass dieser Fehler auftritt, solange Android nicht mit JRE 1.7 funktioniert. Wenn Sie eine neue Funktion verwenden, die seit 1.7 bereitgestellt wird.

Meine Lösung ist, dass ich diesen Quellcode in meinen Code kopiert habe!

gm2008
quelle
1
+1 Ich habe versucht, eine .jar-Datei zu verwenden, die ich mit Java 1.7 kompiliert hatte. Nach dem Neukompilieren des JAR mit Java 1.6 funktionierte es einwandfrei.
Simon Forsberg
4

Die NoClassDefFoundError-Beschreibung stammt aus dem SO-Tag:

Der Java-Fehler wird ausgelöst, wenn die Java Virtual Machine oder eine ClassLoader-Instanz versucht, die Definition einer Klasse zu laden (als Teil eines normalen Methodenaufrufs oder als Teil der Erstellung einer neuen Instanz mit dem neuen Ausdruck) und keine Definition der Klasse dies könnte gefunden werden. Die gesuchte Klassendefinition war vorhanden, als die aktuell ausgeführte Klasse kompiliert wurde, aber die Definition kann nicht mehr gefunden werden.

Oder besser:

NoClassDefFoundError in Java tritt auf, wenn Java Virtual Machine zur Laufzeit keine bestimmte Klasse finden kann, die während der Kompilierungszeit verfügbar war.

von dieser Seite. Überprüfen Sie es, es gibt einige Möglichkeiten, um den Fehler zu beheben. Ich hoffe, es hilft.

Alberto Solano
quelle
Vielen Dank, Alberto! Ihr Beitrag hat mir geholfen, das Problem zu verstehen. Jetzt bin ich gespannt, wie Android mit dem Klassenpfad umgeht. Lesen Sie gerade diese Ausgabe: stackoverflow.com/questions/1095322/…
kjoelbro
@Kjoendo Gern geschehen. Ich werde den Link zu diesem Thema lesen. :)
Alberto Solano
Ich habe das gerade für eine gehabt ConcurrentSkipListMap; Ich denke, das liegt daran, dass meine Anwendung auf einem Froyo-Gerät ausgeführt wurde und diese Klasse in Froyo fehlt. AdMob verlangt jedoch, dass ich auf Ice Cream Sandwich ziele, damit ich das nicht bemerkt habe!
Andrew Wyld
4

In meinem Fall habe ich versucht, eine mit jre 1.7 kompilierte normale Java-Klasse (aus einem normalen Java-Projekt) zu einem mit jre 1.7 kompilierten Android-App-Projekt hinzuzufügen.

Die Lösung bestand darin, diese normale Java-Klasse mit jre 1.6 neu zu kompilieren und wie gewohnt Verweise auf das Android-App-Projekt (auch mit jre 1.6 kompiliert) hinzuzufügen (in Registerkartenreihenfolge und beim Export überprüfen Sie unbedingt die Klasse, das Projekt usw.).

Der gleiche Vorgang, wenn eine Android-Bibliothek verwendet wird, um auf externe normale Java-Klassen zu verweisen.

Ich weiß nicht, was mit jre 1.7 falsch ist, wenn ich normale Java-Klassen aus einem normalen Java-Projekt kompiliere und versuche, sie in Android-App- oder Android-Bibliotheksprojekten zu referenzieren.

Wenn Sie keine normalen Java-Klassen (aus einem normalen Java-Projekt) verwenden, müssen Sie kein Downgrade auf jre 1.6 durchführen.

cfc
quelle
3

Für mich hing dieses Problem mit der API zusammen, die ich verwendet habe und die nicht bereitgestellt wurde. Zum Beispiel habe ich a ZSDK_API.jarals Referenz verwendet.

Um das Problem zu beheben, musste ich mit der rechten Maustaste auf das Projekt klicken und Eigenschaften auswählen. In JAVA BUILD PATH musste ich die API hinzufügen, die nicht bereitgestellt wurde. Dies war seltsam, da die App die nicht gefundene MainActivity-Klasse auslöste und der Fehler in Wirklichkeit dadurch verursacht wurde, dass die DiscoveryHandler-Klasse nicht gefunden wurde.

Hoffe das hilft jemandem.

Tomasz
quelle
2

Ich habe NoClassDefFoundError für eine Klasse getroffen, die in meinem Projekt vorhanden ist (keine Bibliotheksklasse). Die Klasse existiert, aber ich habe NoClassDefFoundError. In meinem Fall war das Problem die Multidex-Unterstützung. Das Problem und die Lösung sind hier: Android Multidex und Support-Bibliotheken

Sie erhalten diesen Fehler für Android-Versionen unter 5.0.

Murat
quelle
2

Auf Android Studio:

1) Fügen Sie multiDexEnabled = trueIhre Standardkonfiguration hinzu

2) Fügen Sie compile com.android.support:multidex:1.0.0 in Ihre Abhängigkeiten ein

3) Application class verlängern MultiDexApplicationstatt nurApplication

Fred Sousa
quelle
1

Andere Idee. Beispielsweise haben Sie eine Klasse, die von "android.support.v4.app.Fragment" abgeleitet ist.

Sie haben jedoch einen Fehler gemacht und ihn von "android.app.Fragment" geerbt. Dann wird dieser Fehler auf den Android 2-Geräten angezeigt.

Manushin Igor
quelle
1

Ich habe gerade etwas mit diesem Fehler herausgefunden.

Stellen Sie einfach sicher, dass die JAR-Datei der Bibliothek die kompilierte R-Klasse unter dem Paket android.support.v7.appcompat enthält, und kopieren Sie alle Res im v7-Appcompat-Support- "Projekt" in Ihren Ordner ANDROID_SDK_HOME / extras / android / support / v7 / appcompat.

Ich verwende Netbeans mit dem Android-Plugin und dies hat mein Problem gelöst.

Marthinus Botha
quelle
1

Ich vermute, dass Sie javacbeim Erstellen der allgemeinen Bibliothek nicht das Ziel angeben , sondern javacautomatisch das neueste verfügbare Ziel verwenden, das wahrscheinlich 1,7 (Java7) oder 1,8 (Java8) ist.

Es wurde bereits festgestellt, dass

Für Android ist die Compiler-Konformitätsstufe 5.0 oder 6.0 erforderlich

dx der Build-Tools von Android <19.0.0 kann Java7-Bytecode (oder höher) nicht in Dalvik-Bytecode konvertieren.

Verwenden Sie also entweder eine Build-Tool-Version> = 19.0.0 oder eine Verwendung javacmit -target 6 , indem Sie beispielsweise Ihre Ameise build.xmlwie folgt ändern :

<javac
srcdir="src/"
destdir="build/"
target="6"
/>
Fließen
quelle
0

Ich habe dieses Problem behoben, indem ich den Projektpfad der Bibliothek manuell in project.propertied hinzugefügt habe. Einige, wie Eclipse diesen Eintrag nicht automatisch zusammen mit "Projekt hinzufügen" hinzugefügt hat. Der Punkt, an dem die App versuchte, Komponenten innerhalb des lib-Projekts zu referenzieren, stürzte ab.

Sie können auch das gleiche versuchen. App-Abhängigkeit in projec.properties wie

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

und Renn .

Shailendra Singh Rajawat
quelle
0

JARs befanden sich früher im Ordner lib /, jetzt befinden sie sich in libs / Wenn Sie lib verwenden, können Sie Ihre Jars von lib in libs verschieben und die Abhängigkeiten aus den Projekteigenschaften / dem Java-Erstellungspfad entfernen, da Android sie jetzt automatisch findet .

Christine
quelle
0

Für mich bestand das Problem darin, dass die Bibliothek, auf die verwiesen wird, mit Java 7 erstellt wurde. Ich habe dieses Problem gelöst, indem ich es mit dem 1.6 JDK neu erstellt habe.

Der Ansager
quelle
0

Einige Zeit java.lang.NoClassDefFoundError: Fehler, wenn ART anstelle der Dalvik-Laufzeit verwendet wird. Um die Laufzeit zu ändern, gehen Sie einfach zu Developer Option -> Select Runtime -> Dalvik.

Nikolay Nikiforchuk
quelle
0

Wenn keines der oben genannten Verfahren funktioniert (wie es mir passiert ist) und Sie ein anderes Projekt in Eclipse als Bibliothek verwenden.

Gehen Sie dazu folgendermaßen vor: Klicken Sie mit der rechten Maustaste auf Projekt -> Eigenschaften -> Android -> Bibliothek -> Hinzufügen

Das hat es für mich getan! Hinzufügen eines Projekts als Bibliothek (Projekteigenschaften)

Feiteira
quelle
0

Aktivität erneut zum Manifest hinzugefügt. Ich habe es in meinem Manifest versucht, dann hat die App funktioniert.

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

Versuchen Sie zu gehen

  • Klicken Sie mit der rechten Maustaste auf Projekt
  • Java-Erstellungspfad
  • Quelle
  • rechte Seite -> Schaltfläche Ordner hinzufügen
  • Ordner libs ausgewählt und OK

Ich hoffe, es hilft.

zxbin
quelle
0

Lösungen:

  1. Listenpunkt
  2. Überprüfen Sie die Exportreihenfolge
  3. Aktivieren Sie Multi Dex
  4. Überprüfen Sie die API-Ansichtsebene im Layout. Ich hatte das gleiche Problem mit searchView. Ich habe die API-Ebene beim Hinzufügen der Suchansicht überprüft, aber hinzugefügt, implementiert SearchView.OnQueryTextListener zur Klassendatei.
Srikanth Reddy Ramidi
quelle
-4

1) Geben Sie in der Manifest-Datei Ihren Aktivitätsnamen und Ihre Aktion sowie die Kategorie an. 2) Geben Sie in Ihrer Aktivität Ihre Startinhaltsansicht und Ihre Ansichts-IDs in der Aktivität an.

Neu in der Android-Entwicklung
quelle
Jemand hat dies fälschlicherweise als keine Antwort gekennzeichnet. Dies ist ein Versuch einer Antwort und gilt daher als Antwort. Wenn Ihnen die Antwort nicht gefällt, ist es die richtige Maßnahme, sie abzustimmen (wie es bereits 5 andere Personen getan haben) und sie nicht zu markieren. Sehen Sie, Ihre Antwort ist in einem anderen Schloss - Wenn eine Antwort keine Antwort ist: meta.stackexchange.com/questions/225370/…
ArtOfWarfare