2010-07-10 4 views
39

J'essaye de construire un projet Android qui a des dépendances. Les fichiers jar sont dans le répertoire lib /. Je peux construire le projet en ajoutant ce fichier jar à mon classpath, mais bien sûr, Force Closes dans l'émulateur car ces bibliothèques ne sont pas présentes. Je le fais depuis la ligne de commande avec ant (et non en eclipse). Comment puis-je faire inclure ces bibliothèques dans l'apk à partir de la ligne de commande?Comment ajouter des bibliothèques de jar externes à un projet android à partir de la ligne de commande

Répondre

29

réponse de Jay K était juste au moment de l'écriture, 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 où external.libs.dir ne fonctionne pas.
Cela a changé in December 2010 puis à nouveau en Octobre 2011.

+6

comment puis-je déclarer plusieurs répertoires? Quel est le séparateur? – Taranfx

+1

Il n'y en a pas. C'est "jar.libs.dir" pas "jar.libs.dirs". Vous ne pouvez spécifier qu'un seul répertoire. Mais dans ce répertoire, vous pouvez créer un lien vers autant de bocaux que vous le souhaitez. –

8

à la compilation faire:

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 

Aussi, lorsque vous conditionnez 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.

7

répondre à ma propre question:

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

external.libs.dir=lib 

Ce fut une coup de chance, vraiment.

+0

Lorsque je fais cela, ant crée un répertoire "libs". Si je mets les bocaux à l'intérieur, ça fonctionne. Malheureusement, j'ai besoin d'utiliser "lib", car tout le monde a configuré "lib" dans Eclipse. Et cette solution ne fonctionne pas pour moi: -/ –

+0

Mais, si j'ai besoin d'ajouter deux bibliothèques de dossiers séparés? Ce que j'ai besoin de faire? – RagnarR

1
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 compile enfin ET est livré avec l'APK.

3

Si vous stockez vos bibliothèques dans $ {basedir}/libs, le script ant sera capable de les trouver. J'ai regardé le script ant actuel ($ {sdk.dir} /tools/ant/build.xml) et il définit jar.libs.dir à "libs".

FYI, le script de la fourmi est bien documenté, donc il est facile de le suivre. Si vous déplacez les bibliothèques, assurez-vous de modifier vos fichiers .classpath pour éviter que les utilisateurs d'Eclipse ne souffrent inutilement.

1

pots de vente dans ${YOUR_PROJECT}/libs répertoire

0

La propriété jar.libs.dir est un seul répertoire. Ce n'est pas comme un CLASSPATH qui est une liste séparée par deux points-virgules. La façon 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 allez dans libs et créez les liens souples requis vers les fichiers .jar dont vous avez besoin.

12

Juste pour référence future: En ce moment il y a 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 à utiliser jar.libs.dir à nouveau (en attendant le bug pour obtenir fixe), est d'ajouter cet objectif 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> 
+0

vous ne pouvez pas écraser le fichier project.all.jars.path comme dans votre exemple. Il en résultera une exception de pointeur nul au cours du processus de construction de fourmis car vous redéfinissez project.all.jars.path pour que $ {toString: project.all.jars.path} évalue à null. La façon correcte de faire ceci est d'introduire un temp.jars.path dans lequel vous incluez le nouveau répertoire jars, et ensuite vous écrasez le project.all.jars.path avec temp.jars.path –

6

l'exemple ci-dessus ne marche pas travailler tout à fait raison. Vous ne pouvez pas remplacer le project.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> 
Questions connexes