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?
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.
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>
À 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.
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.
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>
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.
mettre des bocaux dans ${YOUR_PROJECT}/libs
répertoire
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.
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.