Hinzufügen einer Bibliothek / JAR zu einem Eclipse Android-Projekt

130

Dies ist eine zweiteilige Frage zum Hinzufügen einer Drittanbieter-Bibliothek (JAR) zu einem Android-Projekt in Eclipse.

Der erste Teil der Frage lautet: Wenn ich versuche, meinem Android-Projekt eine JAR (Bibliothek) eines Drittanbieters hinzuzufügen, tritt zuerst das Problem auf

Fehler beim Parsen von XML: ungebundenes Präfix

weil ich versuche, eine Klasse aus dieser JAR zu verwenden (und das Präfix irgendwie definiert haben muss). Was ist los?

Zweitens (nachdem dies behoben wurde - die Antwort ist unten angegeben) funktioniert meine Anwendung unter Android nicht und ich stelle über den Debugger (LogCat) fest, dass die Klasse, die ich zu konsumieren versuche, nicht existiert.

Auslöser: java.lang.ClassNotFoundException: com.github.droidfu.widgets.WebImageView ...

Warum tritt dieses Problem auf dem Emulator auf, wenn in Eclipse kein Kompilierungs- oder Linkerfehler angezeigt wird?

Diese beiden Fragen sind rhetorisch, da ich sie unten selbst beantworten werde. Andere Beiträge in diesem Forum schleichen sich an das Problem heran und an anderer Stelle wird diskutiert, aber ich bin der Meinung, dass ich für den nächsten Mann, der mitkommt, expliziter hilfreich sein kann.

Russ Bateman
quelle

Antworten:

316

Nun zum fehlenden Klassenproblem.

Ich bin ein Eclipse Java EE-Entwickler und habe seit vielen Jahren die Gewohnheit, Bibliotheken von Drittanbietern über den Mechanismus "Benutzerbibliothek" in Build Path hinzuzufügen. Natürlich gibt es mindestens drei Möglichkeiten, eine Bibliothek eines Drittanbieters hinzuzufügen. Die von mir verwendete ist meiner bescheidenen Meinung nach die eleganteste.

Dies funktioniert jedoch nicht für Android, dessen Dalvik "JVM" eine gewöhnliche Java-kompilierte Klasse nicht verarbeiten kann, sondern in ein spezielles Format konvertieren muss. Dies passiert nicht, wenn Sie eine Bibliothek so hinzufügen, wie ich es gewohnt bin.

Befolgen Sie stattdessen die (allgemein verfügbaren) Anweisungen zum Importieren der Bibliothek eines Drittanbieters und fügen Sie sie dann mithilfe des Erstellungspfads hinzu (der Eclipse zu Kompilierungszwecken bekannt macht). Hier ist die Schritt für Schritt:

  1. Laden Sie die Bibliothek auf Ihr Host-Entwicklungssystem herunter.
  2. Erstellen Sie einen neuen Ordner, libs , in Ihrem Eclipse / Android-Projekt.
  3. Klicken Sie mit der rechten Maustaste auf libs und wählen Sie Importieren -> Allgemein -> Dateisystem. Klicken Sie dann im Dateisystem auf Weiter, um das übergeordnete Verzeichnis der Bibliothek zu suchen (dh, in das Sie es heruntergeladen haben).
  4. Klicken Sie auf OK, dann auf den Verzeichnisnamen (nicht auf das Kontrollkästchen) im linken Bereich und aktivieren Sie die entsprechende JAR im rechten Bereich. Dadurch wird die Bibliothek (physisch) in Ihr Projekt eingefügt.
  5. Klicken Sie mit der rechten Maustaste auf Ihr Projekt, wählen Sie Erstellungspfad -> Erstellungspfad konfigurieren, klicken Sie auf die Registerkarte Bibliotheken, dann auf JARs hinzufügen ..., navigieren Sie zu Ihrer neuen JAR im libs- Verzeichnis und fügen Sie sie hinzu. (Dies ist übrigens der Moment, in dem Ihre neue JAR für die Verwendung unter Android konvertiert wird.)

HINWEIS

Schritt 5 ist möglicherweise nicht erforderlich, wenn die Bibliothek bereits in Ihrem Erstellungspfad enthalten ist. Stellen Sie einfach sicher, dass es zuerst vorhanden ist, bevor Sie es hinzufügen.

Was Sie hier getan haben, bewirkt zwei Dinge:

  1. Enthält eine von Dalvik konvertierte JAR in Ihrem Android-Projekt.
  2. Stellt Eclipse Java-Definitionen zur Verfügung, um die Klassen von Drittanbietern zu finden, wenn Sie den Quellcode Ihres Projekts entwickeln (dh kompilieren).
Russ Bateman
quelle
Russ, du solltest wahrscheinlich eine andere separate Frage stellen. Diese "Antwort" sieht irgendwie seltsam aus, wenn man hier sitzt.
Paul Gregoire
3
Also habe ich Teile der Frage ein wenig umgeschrieben. Ich habe mich der Versuchung widersetzt, das Einfache zu tun (was Sie hier vorschlagen), weil ich wirklich denke, dass beide Probleme durch den Versuch entstehen, eine Bibliothek eines Drittanbieters hinzuzufügen, und ich wette, dass jeder, der das zweite Problem hat, wahrscheinlich das hatte erste auch. Vielen Dank.
Russ Bateman
Ich wünschte, es hätte etwas expliziteres in formellen Android-Dokumenten gegeben (bin noch nicht darauf gestoßen), und andere Antworten in anderen Foren gehen auf das Problem zu, aber es ist nie außer Sicht. Beachten Sie, dass bei BlackBerry dasselbe Problem ein großer Albtraum ist, bei dem niemand zuverlässige Informationen zur Lösung gibt - nicht sicher, was ich dort tun werde.
Russ Bateman
2
Hallo @RussBateman, ich habe die oben genannten Schritte ausprobiert und konnte das Bibliotheksglas erfolgreich in mein Android-Projekt aufnehmen. Daher waren die Bibliotheksklassen zur Kompilierungszeit für mein Projekt zugänglich. Beim Ausführen des Projekts wird jedoch eine Fehlermeldung angezeigt in meiner Konsole: "Konvertierung in das Dalvik-Format mit Fehler 1 fehlgeschlagen" .. und mein Projekt wurde nicht gestartet!
Zeba
Unter bestimmten Umständen funktioniert dies nicht ... Ich erinnere mich nicht genau, was ich getan habe, habe den libs-Ordner gelöscht, ihn erneut gelesen ... habe jetzt alles getan, was du gesagt hast, füge libs hinzu, importiere das jar, füge hinzu, um den Pfad zu erstellen. Compilerfehler sind verschwunden, erhalten aber immer noch eine Laufzeitausnahme, dass die Klasse nicht gefunden wird :(
Ixx
20

Stellen Sie sicher, dass sich Ihre Jars von Drittanbietern im Ordner "libs" Ihres Projekts befinden und beim Packen Ihrer Anwendung in die APK-Datei eingefügt werden. Möglicherweise werden Laufzeitfehler auf dem Gerät angezeigt, wenn etwas in der JAR nicht unterstützt wird, aber ansonsten habe ich großen Erfolg damit gehabt.

Paul Gregoire
quelle
1
Es geht nur um Erfahrung, ich hatte das gleiche Problem schon einmal :)
Paul Gregoire
Vielen Dank, Sir, aber es ist schade zu sehen, dass der libs-Ordner die Kopie externer Jar-Dateien benötigt, die wir bereits im Maven-Repository oder irgendwo haben.
Asgs
1
Leider funktioniert dies nicht mehr automatisch. Sie müssen eclipse auch anweisen, die Bibliotheken in Paketdateien aufzunehmen.
Neil Townsend
Wann hat sich das geändert? Dies ist eine große Veränderung gegenüber dem, was wir alle gewohnt sind.
Paul Gregoire
5

Einrichten eines Bibliotheksprojekts

Ein Bibliotheksprojekt ist ein Standard-Android-Projekt, sodass Sie ein neues Projekt genauso erstellen können wie ein neues Anwendungsprojekt.

Wenn Sie das Bibliotheksprojekt erstellen, können Sie nach Bedarf einen beliebigen Anwendungsnamen und ein beliebiges Paket auswählen und andere Felder festlegen (siehe Abbildung 1).

Legen Sie als Nächstes die Projekteigenschaften fest, um anzuzeigen, dass es sich um ein Bibliotheksprojekt handelt:

Klicken Sie im Paket-Explorer mit der rechten Maustaste auf das Bibliotheksprojekt und wählen Sie Eigenschaften. Wählen Sie im Eigenschaftenfenster links die Eigenschaftengruppe "Android" aus und suchen Sie rechts die Bibliothekseigenschaften. Aktivieren Sie das Kontrollkästchen "Ist Bibliothek" und klicken Sie auf Übernehmen. Klicken Sie auf OK, um das Eigenschaftenfenster zu schließen. Das neue Projekt ist jetzt als Bibliotheksprojekt markiert. Sie können mit dem Verschieben von Quellcode und Ressourcen beginnen, wie in den folgenden Abschnitten beschrieben.

Witz
quelle
4

Wenn Sie ADT Version 22 verwenden, müssen Sie die Android-Abhängigkeiten und privaten Android-Bibliotheken auf der Registerkarte Reihenfolge und Export im Projekterstellungspfad überprüfen

ajaykoppisetty
quelle
2

Erstens das Problem des fehlenden Präfixes.

Wenn Sie in Ihrer Layoutdatei etwas verwenden, das von einem Drittanbieter stammt, müssen Sie möglicherweise auch dessen Präfix verwenden, z. B. "droidfu:", das an mehreren Stellen im folgenden XML-Konstrukt vorkommt:

<com.github.droidfu.widgets.WebImageView android:id="@+id/webimage"
          android:layout_width="75dip"
          android:layout_height="75dip"
          android:background="#CCC"
          droidfu:autoLoad="true"
          droidfu:imageUrl="http://www.android.com/images/opensourceprojec.gif"
          droidfu:progressDrawable="..."
          />

Dies kommt aus der JAR, aber Sie müssen auch die neuen "xmlns: droidfu" hinzufügen.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:droidfu="http://github.com/droidfu/schema"
      ...>

oder Sie erhalten den ungebundenen Präfixfehler. Für mich war dies ein Fehler beim Kopieren und Einfügen des gesamten bereitgestellten Beispiels von den Seiten der Drittanbieter-Bibliothek.

Russ Bateman
quelle
1

Fehler beim Parsen von XML: ungebundenes Präfix

Die Ressource '/ playteddy / res' existiert nicht.

Ich habe die beiden oben genannten Fehler erhalten und sie schließlich behoben.

Klicken Sie mit der rechten Maustaste auf Ihr Projekt -> Eigenschaften -> Java-Erstellungspfad -> googleadmobadsdk (wählen Sie es aus und setzen Sie es oben), dann werden Sie ausgeführt und das Problem gelöst. Es ist mein Laufzeitfehler behoben.

Sujan
quelle
0

Legen Sie die Quelle in einem Ordner außerhalb Ihres Arbeitsbereichs ab. Klicken Sie mit der rechten Maustaste in den Projektexplorer und wählen Sie "Importieren ...".

Importieren Sie das Projekt als Android-Projekt in Ihren Arbeitsbereich. Versuchen Sie, es zu erstellen, und stellen Sie sicher, dass es als Bibliotheksprojekt markiert ist. Stellen Sie außerdem sicher, dass es mit Google API-Unterstützung erstellt wurde. Andernfalls werden Kompilierungsfehler angezeigt.

Klicken Sie dann mit der rechten Maustaste auf Ihr Hauptprojekt im Projektexplorer. Wählen Sie Eigenschaften und dann links Android. Klicken Sie im Bibliotheksbereich unten auf "Hinzufügen".

Die Mapview-Ballons-Bibliothek sollte jetzt verfügbar sein, um sie Ihrem Projekt hinzuzufügen.

Leander
quelle
0

Gehen Sie zum Erstellen eines Pfads in Eclipse, klicken Sie auf Reihenfolge und Exportieren, überprüfen Sie die Bibliothek / das JAR und klicken Sie dann auf die Schaltfläche Nach oben, um sie an den Anfang der Liste zu verschieben und zuerst zu kompilieren.

Sam Adamsh
quelle