2012-03-27 15 views
18

Desde el último SDK de Android no estoy en condiciones de ejecutar mis aplicaciones Android desde el eclipse más porque no pueden encontrar clases que tengo en otros proyectos de eclipse, que son referencias a través de la ruta de compilación 'normal'.proyecto Android "normal" en el eclipse desde la actualización herramientas de SDK 17

esto definitivamente ha trabajado antes. y no hay errores de compilación en eclipse.

Podría ser que, ahora usted tiene que marcar esos proyectos como proyectos de bibliotecas android en caso de que se hace referencia mediante un proyecto androide.

edición: Parece que esta es la razón por la que se rompe: http://tools.android.com/recent/dealingwithdependenciesinandroidprojects

pero todavía tengo que encontrar la manera i ahora debería hacer referencia a mis proyectos "normales" Java al proyecto aplicación para Android.

+0

¿Cuál es el error de tiempo de ejecución? ClassNotFound o ClassDefNotFound? – Ognyan

+1

java.lang.NoClassDefFoundError – clamp

+2

_this definitivamente ha funcionado antes_, no sé cómo lo haces funcionar. También tengo un proyecto de Android que hace referencia a otro proyecto regular de Java, y el apk solo funciona si agrego explícitamente el archivo java generado por el proyecto java en la ruta de compilación del proyecto android. Parece que el último SDK r17 tergiversa completamente este comportamiento y ahora solo acepta los archivos jar de la biblioteca la carpeta predefinida libs. No he encontrado una solución aún. – yorkw

Respuesta

18

En el link @clamp siempre que exista la siguiente frase:

El contenedor ahora también se rellenará con proyectos de Java, sólo que se hace referencia en los proyectos de bibliotecas.

Esto significa que podemos usar un proyecto de biblioteca vacío como un proyecto de "pegamento" entre el proyecto de Android y el proyecto de eclipse normal. Sólo tienes que configurar de esta manera:

androide -> proyecto "pegamento" -> proyecto normal

-> significa depende de

El proyecto de pegamento tiene que exportar el proyecto normal y tiene que ser marcado como biblioteca. En el proyecto de Android, solo se debe hacer referencia al proyecto de la biblioteca.

Ahora, usar un proyecto de eclipse normal funciona de nuevo para mí con la sobrecarga mínima del proyecto "pegamento".

+0

si bien esta solución no me gusta, la aceptaré como respuesta, ya que funciona. – clamp

+1

Esto no funciona para mí. Desde que actualicé a la versión 21, no puedo agregar proyectos externos de Java a proyectos de Android. Probé el enfoque directo y este indirecto, pero sin suerte, sigue recibiendo el error, y el archivo .apk no contiene las clases requeridas. –

+1

¿Esto todavía funciona para usted? No pude hacer que funcione. Creo un Android GlueProject que requiere mi Java LibProject (en Propiedades> Ruta de compilación de Java> pestaña Proyectos). También me aseguro de exportar LibProject mirándolo (en Propiedades> Ruta de compilación de Java> Ordenar y exportar) y hacer que GlueProject se marque como proyecto de biblioteca marcando "Es biblioteca" (en Propiedades> Android). En mi proyecto de Android, donde deseo usar LibProject, agrego una referencia a GlueProject (en Propiedades> Android). Mi proyecto de Android se compila, pero obtiene un NoClassDefFoundError cuando se ejecuta:/ – Felix

12

Desde la última actualización de las herramientas de construcción de eclipse que tiene que marcar también los proyectos de referencia en la pestaña 'Orden y exportación' en 'Java Build Path'. Esto me solucionó el mismo problema. ¡Espero que ayude!

+1

no lo arreglé para mí, sigue siendo el mismo problema. gracias de todos modos. – clamp

+0

Ah, lástima, estaba seguro de que era eso. Definitivamente tiene todos sus proyectos Java referenciados en 'Proyectos', y los tiene todos marcados en 'Ordenar y Exportar' junto con 'Dependencias de Android'. También asegúrate de que los archivos jar de la biblioteca que estés utilizando en tu proyecto estén en una carpeta llamada 'libs' (mientras estén allí no es necesario que los incluyas manualmente en la ruta de compilación, las nuevas herramientas eclipse los incluirán automáticamente) – kingraam

+0

sí, lo compré doble y en realidad me sorprendería si esto tuviera alguna influencia sobre el tema. ya que el pedido y la exportación solo se aplican a proyectos que deben enviar sus dependencias a cualquier otro proyecto que tenga referencias.(como una jerarquía de dependencias de 2 capas) – clamp

3

Como ya se mencionó, Android no compilará ni usará directamente sus archivos de proyecto Java. En cambio, solo requiere archivos de clase precompilados.

Aquí está mi solución, que prefiero porque no necesito ningún proyecto de "pegamento" solo para las bibliotecas de Android. La idea principal es proporcionar un JAR pre-construido para Android, sin dejar de utilizar el código fuente de las bibliotecas mientras se trabaja en Eclipse:

  1. En primer lugar asegurarse de que los proyectos de biblioteca se compilan utilizando Java 6. Java 7 no funcionará, Android ignorará silenciosamente esas bibliotecas. Por lo tanto, compruebe la configuración del espacio de trabajo (en Preferences ->Java ->Compiler) y la configuración individual del proyecto. Elija 1.6 como el nivel de cumplimiento del compilador.
  2. Haga clic derecho en su proyecto Android ->Properties ->Java Build Path ->Projects. Agregue todos los proyectos Java que quiera usar en su proyecto Android.
  3. Ahora, Eclipse conoce las clases (pero aún no la versión final de Android), por lo que los errores de compilación se resuelven y saltar a una clase conduce directamente al archivo fuente original de su proyecto Java.
  4. Agregue un buildscript de hormiga en el directorio de su proyecto de Android. Este buildscript creará un JAR que contiene todos los archivos .class de sus proyectos en el subdirectorio libs (y este es el paso que le permite a Android conocer sus archivos .class). Vea a continuación el código.
  5. Ahora, y siempre que los proyectos de Java hayan cambiado, reconstruya el archivo JAR ejecutando el archivo de compilación. Esto también puede ser automatizado, véase por ejemplo "Want an eclipse java project to run ant build files automatically"

Aquí está el código:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<project default="create_jar" name="Create Jar with classes from Java projects"> 
<target name="create_jar"> 
    <jar destfile="libs/java-projects.jar"> 
     <!-- "bin" is the class output folder --> 
     <fileset dir="path/to/first/java/project/bin"/> 
     <fileset dir="path/to/second/java/project/bin"/> 

     <fileset dir="path/to/last/java/project/bin"/> 
    </jar> 
</target> 

+0

Proyectos individuales> Compilador de Java> El cumplimiento de JDK para el proyecto en particular debería ser suficiente, ¿no? Y establecer el compilador en un entorno de ejecución 1-6 (apuntando a una JVM real de 1.6). Puede dar algunas ideas para mi pregunta: http://stackoverflow.com/questions/18981837/android-library-project-does-not-export-its-class-dependencies –

1

que añade un constructor proyecto hormiga que copia los archivos de clase en el proyecto dependiente. El archivo ant reside en el proyecto de Android y copia los archivos de clase del proyecto al que se hace referencia. Aquí está la hormiga:

<?xml version="1.0" encoding="UTF-8"?> 
<project name="CommonsCopy" default="copy" basedir="."> 
    <target name="copy"> 
     <copy todir="bin/classes"> 
      <fileset dir="../Commons/bin" includes="**/*.class"> 
      </fileset> 
     </copy> 
    </target> 
</project> 

2 cosas para recordar:

  1. encontrar una manera de copiar los archivos JAR que utiliza el proyecto java referencia, o simplemente ponerlos directamente en la carpeta libs Android.
  2. El proyecto al que se hace referencia debe compilarse en el nivel de cumplimiento 1.6.
+0

Tenga en cuenta que la gran desventaja aquí es que si cambie el proyecto de Java, necesitará cambiar algún archivo en el proyecto de Android para iniciar el generador de hormigas. –

0

Puede definir dos proyectos (un Android, un Java vainilla) y hacer uno referirse a los archivos fuente del otro proyecto utilizando el comando mklink en Windows para crear un enlace de directorio o un enlace de archivo. No conozco el equivalente de Linux, pero debe haber uno. Si edita un archivo fuente desde un proyecto, el otro proyecto no estará sincronizado y solo tendrá que actualizarlo. De esta forma, no tiene que meterse con los jar o con el proceso de compilación de Eclipse.

Cuestiones relacionadas