2010-07-10 16 views
39

Estoy intentando crear un proyecto Android que tenga algunas dependencias. Los archivos jar están en el directorio lib /. Puedo construir el proyecto agregando esos archivos jar a mi classpath, pero por supuesto Force Closes en el emulador porque esas bibliotecas no están presentes.Cómo agregar bibliotecas jar externas a un proyecto de Android desde la línea de comandos

Estoy haciendo esto desde la línea de comandos con ant (no en eclipse). ¿Cómo puedo hacer que incluya esas bibliotecas en la aplicación desde la línea de comandos?

Respuesta

29

Jay K era correcta en el momento de la escritura, pero ahora el SDK ha cambiado, y aquí está la nueva manera de hacerlo:

Añadir la siguiente línea a ant.properties:

jar.libs.dir=lib 

Probado, funciona donde external.libs.dir no funciona.
que cambió in December 2010 y luego otra vez en octubre de 2011.

+6

¿cómo declaro múltiples directorios? ¿Cuál es el separador? – Taranfx

+1

No hay uno. Es "jar.libs.dir" no "jar.libs.dirs". Solo puedes especificar un solo directorio. Pero en ese directorio puede vincular tantos archivos como necesite. –

8

En la compilación de hacer esto:

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

Y, cuando se generan el código de bytes de Dalvik:

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

Además, cuando se está empaquetando el archivo APK:

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

Supongo que estás usando Linux ... en Windows será casi lo mismo.

7

responder a mi propia pregunta:

he creado un archivo "build.properties" y ha añadido la línea

external.libs.dir=lib 

Fue un golpe de suerte, de verdad. La respuesta de

+0

Cuando lo hago, horm crea un directorio "libs". Si pongo los frascos adentro, funciona. Desafortunadamente necesito usar "lib", porque todos han configurado "lib" en Eclipse. Y esta solución no funciona para mí: -/ –

+0

Pero, ¿si necesito agregar dos bibliotecas de carpetas separadas? ¿Qué necesito hacer? – RagnarR

1
external.libs.dir=lib 

después de 2 horas de búsqueda de esta respuesta, esto funcionó para mí. El archivo jar en mi directorio libs finalmente compila Y se incluye con el APK.

3

Si almacena sus bibliotecas en $ {basedir}/libs, la secuencia de comandos ant será capaz de encontrarlas.

Miré el script actual ant ($ {sdk.dir} /tools/ant/build.xml) y define jar.libs.dir como "libs".

FYI, la secuencia de comandos de la hormiga está bien documentada por lo que es fácil de seguir.

Si mueve librerías, asegúrese de editar sus archivos .classpath para evitar que los usuarios de eclipse sufran innecesariamente.

1

frascos de venta en ${YOUR_PROJECT}/libs directorio

0

La propiedad jar.libs.dir es un único directorio . No es como una CLASSPATH que es una lista separada por dos puntos/coma y coma. La forma de tener múltiples directorios en tu jar.libs.dir es no establecerlo directamente; deje que sea el predeterminado en libs y vaya a libs y cree los enlaces suaves requeridos a los archivos .jar que necesite.

12

Sólo para referencia futura: En este momento hay un error en el SDK que impide el uso de jar.libs.dir: http://code.google.com/p/android/issues/detail?id=33194

Una solución fácil de usar jar.libs.dir de nuevo (a la espera de el error para solucionarlo), es agregar este destino en el archivo 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

no puede sobreescribir el proyecto.all.jars.path como lo hizo en su ejemplo. Causará una excepción de puntero nulo durante el proceso de construcción de ant porque está redefiniendo project.all.jars.path para que $ {toString: project.all.jars.path} evalúe como nulo. La forma correcta de hacerlo es introducir un temp.jars.path en el que incluya su nuevo directorio jars, y luego sobrescriba el proyecto.all.jars.path con temp.jars.path –

6

El ejemplo anterior no funcionó del todo bien. No puede sobrescribir el proyecto.all.jars.path en línea. A continuación se muestra un ejemplo de trabajo:

<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> 
Cuestiones relacionadas