web-dev-qa-db-fra.com

Comment ajouter des bibliothèques jar externes à un projet Android à partir de la ligne de commande

J'essaye de construire un projet Android qui a quelques dépendances. Les fichiers jar sont dans le répertoire lib /. Je peux construire le projet en ajoutant ces fichiers jar à mon chemin de classe, mais bien sûr il force se ferme dans l'émulateur car ces bibliothèques ne sont pas présentes.

Je fais cela à partir de la ligne de commande avec ant (not dans Eclipse). Comment puis-je faire inclure ces bibliothèques dans l'apk à partir de la ligne de commande?

39
Jay K

La réponse de Jay K était juste au moment de la rédaction, mais maintenant le SDK a changé, et voici la nouvelle façon de le faire:

Ajoutez la ligne suivante à ant.properties:

jar.libs.dir=lib

Testé, fonctionne là où external.libs.dir ne fonctionne pas.
Cela a changé en décembre 201 puis à nouveau en octobre 2011.

29
Nicolas Raoul

Juste pour référence future: il y a actuellement un bogue dans le SDK qui empêche d'utiliser jar.libs.dir: http://code.google.com/p/Android/issues/detail?id=33194

Une solution simple pour réutiliser jar.libs.dir (en attendant que le bogue soit corrigé), consiste à ajouter cette cible dans le fichier build.xml:

<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>
12
Panayotis

À la compilation, procédez comme suit:

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

Et, lorsque vous générez le bytecode pour Dalvik:

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

De plus, lorsque vous empaquetez le fichier APK:

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

Je suppose que vous utilisez Linux ... sur Windows sera presque le même.

8
Cristian

Répondre à ma propre question:

J'ai créé un fichier "build.properties" et ajouté la ligne

external.libs.dir=lib

C'était une chance, vraiment.

7
Jay K

L'exemple ci-dessus ne fonctionne pas tout à fait correctement. Vous ne pouvez pas remplacer le projet.all.jars.path en ligne. Voici un exemple de travail:

<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>
6
Akos Cz

Si vous stockez vos bibliothèques dans $ {basedir}/libs, le script ant pourra les trouver.

J'ai regardé le script ant actuel ($ {sdk.dir} /tools/ant/build.xml) et il définit jar.libs.dir à "libs".

Pour info, le script ant est bien documenté donc il est facile de le retrouver.

Si vous déplacez des bibliothèques, assurez-vous de modifier vos fichiers .classpath pour éviter que les utilisateurs d'Eclipse ne souffrent inutilement.

3
Peter Kahn

mettre des bocaux dans ${YOUR_PROJECT}/libs répertoire

1
shaobin0604
external.libs.dir=lib

après 2 heures de recherche de cette réponse, cela a fonctionné pour moi. Le fichier jar dans mon répertoire libs se compile enfin ET est fourni avec l'APK.

1
gpacer68

La propriété jar.libs.dir Est un répertoire nique. Ce n'est pas comme un CLASSPATH qui est une liste séparée par deux points/points-virgules. Le moyen d'avoir plusieurs répertoires dans votre jar.libs.dir est de ne pas le définir directement; laissez-le par défaut à libs et accédez aux bibliothèques et créez les liens logiciels nécessaires vers les fichiers .jar dont vous avez besoin.

0
Scott C Wilson