2010-07-10 2 views
39

hinzufügen Ich versuche, ein Android-Projekt, das einige Abhängigkeiten hat. Die JAR-Dateien befinden sich im Verzeichnis lib /. Ich kann das Projekt erstellen, indem ich diese JAR-Datei zu meinem Classpath hinzufüge, aber natürlich erzwingt es das Schließen im Emulator, weil diese Bibliotheken nicht vorhanden sind.Wie externe jar-Bibliotheken zu einem Android-Projekt von der Befehlszeile

Ich mache dies von der Befehlszeile mit Ant (nicht in Eclipse). Wie kann ich dafür sorgen, dass diese Bibliotheken über die Befehlszeile in die Apk eingebunden werden?

Antwort

29

Jay K Antwort richtig war zum Zeitpunkt des Schreibens, aber jetzt ist das SDK hat sich verändert, und hier ist die neue Art und Weise, es zu tun:

Fügen Sie die folgende Zeile in ant.properties:

jar.libs.dir=lib 

Getestet, funktioniert, wo external.libs.dir nicht funktioniert.
Die in December 2010 geändert und dann wieder im Oktober 2011.

+6

Wie deklariere ich mehrere Verzeichnisse? Was ist der Separator? – Taranfx

+1

Es gibt keins. Es ist "jar.libs.dir" und nicht "jar.libs.dirs". Sie können nur ein einzelnes Verzeichnis angeben. Aber in diesem Verzeichnis können Sie so viele Gläser wie nötig verlinken. –

8

Bei dieser Zusammenstellung tun:

javac -encoding ascii -target 1.5 -d bin/classes \ 
-bootclasspath $SDKDIR/android.jar src/some/project/* -classpath=libs/*.jar 

Und wenn Sie den Bytecode für Dalvik generieren:

dx --dex --output=bin/classes.dex bin/classes libs/*.jar 

Auch wenn Sie verpacken die APK-Datei:

apkbuilder bin/something.apk -z bin/projectname.ap_ \ 
-f bin/classes.dex -rf src -rj libs 

Ich nehme an, Sie verwenden Linux ... unter Windows wird fast das gleiche sein.

7

meine eigene Frage zu beantworten:

hat ich eine Datei "build.properties" und hinzugefügt, um die Linie

external.libs.dir=lib 

Es war eine glückliche Vermutung, wirklich.

+0

Wenn ich dies tue, erstellt ant ein "libs" -Verzeichnis. Wenn ich die Gläser hineinsetze, funktioniert es. Leider muss ich "lib" verwenden, da jeder "lib" in Eclipse konfiguriert hat. Und diese Lösung funktioniert nicht für mich: -/ –

+0

Aber, wenn ich zwei Bibliotheken aus getrennten Ordnern hinzufügen müssen? Was ich tun muss? – RagnarR

1
external.libs.dir=lib 

nach 2 Stunden für diese Antwort zu suchen, das für mich gearbeitet. Die JAR-Datei in meinem libs-Verzeichnis kompiliert schließlich UND ist mit der APK gebündelt.

3

Wenn Sie Ihre Bibliotheken in $ {basedir}/libs speichern, kann das ant-Skript sie finden.

Ich schaute auf das aktuelle Ameisen-Skript ($ {sdk.dir} /tools/ant/build.xml) und es definiert jar.libs.dir zu "libs".

FYI, das Ameisen-Skript ist gut dokumentiert, so dass es leicht zu verfolgen ist.

Wenn Sie libs verschieben, sollten Sie Ihre .classpath-Dateien bearbeiten, um zu verhindern, dass Eclipse-Benutzer unnötig leiden.

1

Put-Gläser in ${YOUR_PROJECT}/libs Verzeichnis

0

Die jar.libs.dir Eigenschaft ist ein einziges Verzeichnis. Es ist nicht wie eine CLASSPATH, die eine Doppelpunkt/Semikolon getrennte Liste ist. Der Weg, mehrere Verzeichnisse in Ihren jar.libs zu haben.dir ist es nicht direkt einzustellen; Lassen Sie es standardmäßig auf libs und gehen Sie auf libs und erstellen Sie die erforderlichen Soft-Links zu .jar-Dateien, die Sie benötigen.

12

Gerade für die Zukunft: Im Moment gibt es einen Fehler in dem SDK, die jar.libs.dir der Verwendung verhindert: http://code.google.com/p/android/issues/detail?id=33194

Eine einfache Lösung jar.libs.dir wieder zu verwenden (während des Wartens auf Der Fehler, der behoben werden soll, besteht darin, dieses Ziel in die Datei build.xml einzufügen:

<target name="-pre-compile"> 
    <path id="project.all.jars.path"> 
     <path path="${toString:project.all.jars.path}"/> 
     <fileset dir="${jar.libs.dir}"> 
      <include name="*.jar"/> 
     </fileset> 
    </path> 
</target> 
+0

Sie können den project.all.jars.path nicht wie in Ihrem Beispiel überschreiben. Dies führt zu einer Nullzeigerausnahme während des Ant-Build-Prozesses, da Sie project.all.jars.path neu definieren, so dass $ {toString: project.all.jars.path} auf null ausgewertet wird. Der richtige Weg, dies zu tun, ist, einen temp.jars.path einzuführen, in den Sie ein neues jars dir einfügen, und dann überschreiben Sie den project.all.jars.path mit temp.jars.path –

6

Das obige Beispiel funktioniert nicht ganz richtig. Sie können den project.all.jars.path inline nicht überschreiben. Folgendes ist ein funktionierendes Beispiel:

<target name="-pre-compile"> 
<!-- HACK to add the android-support-v4.jar to the classpath directly from the SDK --> 

    <echo>ORIGINAL jars.path : ${toString:project.all.jars.path}</echo> 
    <path id="project.all.jars.path.hacked"> 
      <path path="${toString:project.all.jars.path}"/> 
      <path path="${sdk.dir}/extras/android/support/v4/android-support-v4.jar"/> 
    </path> 

    <path id="project.all.jars.path"> 
      <path path="${toString:project.all.jars.path.hacked}"/> 
    </path> 
    <echo>HACKED jars.path : ${toString:project.all.jars.path}</echo> 

</target> 
Verwandte Themen