Frage NoClassDefFoundError für Code in einer Java-Bibliothek auf Android


Ich erhalte häufig einen Fehler unter meinen Nutzern. Die App stürzt beim Start ab. Wenn die MainActivity geladen werden soll, kann die VM die Klasse offenbar nicht finden. Ich kann nicht herausfinden warum. Die Architektur der App ist, dass es ein gemeinsames Projekt gibt, das sowohl meine freie 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]

Bearbeiten: Danke für den Kommentar unten, Richard. Jetzt habe ich mich verändert com.android.Splash zu etwas anderem. Es war sowieso nicht der richtige Klassenname. Mein Fehler...!


75
2017-12-30 10:47


Ursprung


Antworten:


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

  1. Gehe zu "Eigenschaften" des Projekts.
  2. Wählen Sie "Java-Build-Pfad"
  3. Wählen Sie die Registerkarte "Bestellung und Export"
  4. Sie sollten die Pfade und Abhängigkeiten des ausgewählten Projekts "src" und "gen" hier sehen.
  5. Die Reihenfolge, wie sie aufgelistet wurden, war zuerst "src" und dann "gen" Pfad
  6. Ich wechsle sie, so dass "gen" -Ordner vor dem "src" erstellt wird

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

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

Ehrlich gesagt, habe ich noch nie "Android Tools> Fix Project Properties" ausprobiert, manchmal macht es das gleiche. Ich weiß es nicht, ich habe es gerade erst gemacht, nachdem ich die Fehlermeldung gesehen habe und dachte, dass etwas mit den Buildpfaden nicht stimmt.


Bearbeiten


Später reichte es nicht aus, ich bekam den Fehler nochmal. Dann habe ich alle Abhängigkeiten überprüft, die in dieser Ansicht aufgelistet sind. Jetzt funktioniert es wieder. So weit, ist es gut. Ich werde dies aktualisiert halten, wenn es erneut fehlschlägt.

FYI: In meinem letzten Versuch habe ich versucht "Android Tools> Fix Projekteigenschaften", aber es hat nicht für mich geklappt.


126
2017-10-03 05:19



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

Ich war in der Lage, Dinge zur Arbeit zu bringen

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

Dies brachte diese erstellten Java-Klassendateien, die für die Dalvik-VM kompiliert wurden, anstelle der Java-VM, wenn das Android-Projekt erstellt wurde. Dadurch konnten die Java-Klassendateien in der JAR-Datei der Android-Bibliothek beim Erstellen des Android-Projekts ".apk" durch Dexing ausgeführt werden. Jetzt, als die App ausgeführt wurde, wurden die Java-Projektklassen gefunden, statt dass ein Java.lang.NoClassDefFoundError geworfen 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 'is library' ist unter Eigenschaften -> Android aktiviert.) Sie müssen dann 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-Bibliotheksprojekt. Dann können Sie die erstellte JAR-Datei des Android-Projekts in den Ordner "libs" des Android-Ordners kopieren, da die darin enthaltenen Klassendateien für die Davlik-VM und nicht für die Java-VM kompiliert wurden, als das Android-Projekt erstellt wurde. Dadurch können die Java-Klassendateien in der JAR-Datei der Android-Bibliothek beim Erstellen des Android-Projekts ".apk" durchgehen. Wenn die App jetzt ausgeführt wird, werden die Java-Projektklassen anstelle eines Java.lang.NoClassDefFoundError gefunden.


18
2018-06-21 06:13



Versuchen Sie, zu Projekt -> Eigenschaften -> Java-Build-Pfad -> Bestellen und Exportieren zu gehen und sicherzustellen, dass Android Private Libraries auf Ihr Projekt und alle anderen von Ihnen verwendeten Bibliotheksprojekte überprüft werden. Ich habe die Lösung durch folgenden Link erreicht NoClassDefFoundError Android Projekt?


17
2018-03-28 10:13



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

Ich habe das Projekt gerade geputzt und es hat für mich funktioniert.

Eclipse -> Projekt -> Reinigen -> Wähle das Projekt und säubere es


8
2017-07-04 05:46



Ich habe alle oben genannten Lösungen ausprobiert, aber nicht für mich gearbeitet, Hier ist, was ich getan habe, um es zu erledigen project-> config build path-> order and export-> verschiebt abhängiges Projekt oben


7
2017-08-13 23:50



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


6
2018-04-21 10:20



Ich habe diesen NoClassDefFoundError gefunden, als ich java.nio.charset.StandardCharsets verwendet habe.

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

Da StandardCharsets jedoch erst seit dem 1.7. Es hat NoClassDefFoundError gemeldet, als ich es ausgeführt habe.

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

Allgemeine Schlussfolgerung ist, dass, solange Android nicht mit JRE 1.7 funktioniert, wenn Sie eine neue Funktion seit 1.7 verwenden, dieser Fehler auftritt.

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


5
2017-12-30 10:54



Die NoClassDefFoundError-Beschreibung stammt vom SO-Tag:

Der Java-Fehler wird ausgelöst, wenn die Java Virtual Machine oder ein ClassLoader   Instanz versucht, die Definition einer Klasse zu laden (als Teil einer   normaler Methodenaufruf oder als Teil des Erstellens einer neuen Instanz mit dem neuen   Ausdruck) und keine Definition der Klasse gefunden werden konnte. Das   Nach der Klassendefinition gesucht existierte während der Ausführung   Klasse wurde kompiliert, aber die Definition kann nicht mehr gefunden werden.

Oder besser:

NoClassDefFoundError in Java kommt, wenn Java Virtual Machine nicht ist   in der Lage, eine bestimmte Klasse zur Laufzeit zu finden, die während war   Kompilierzeit

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


4
2017-11-27 15:24