Actividad de Android bajo Eclipse / ADT con dependencias de proyecto (Error en la resolución de XY)

He intentado mantener un proyecto de juego bastante independiente de la plataforma así que lo dividió en tres proyectos de nivel bajo a nivel superior de android específicos como eso: motor, juego, android juego.

Las clases / interfaces involucradas en el error son las siguientes:

  1. (De nivel bajo) define esta interfaz:

    com.myteam.engine.IGame 
  2. (Nivel medio) plataforma de juego independiente define las siguientes categorías:

     com.myteam.myproject.Game com.myteam.myproject.MyProject (derived from com.myteam.myproject.Game) 
  3. (Nivel superior) el proyecto androide implementa la actividad, etc .:

     com.myteam.myproject.android.MyAndroidActivity (using com.myteam.myproject.MyProject) 

Todo se compila bien y funciona perfectamente bajo Windows (con otro proyecto de Windows en el nivel 3 usando los dos primeros).

Pero cuando se ejecuta con ADT falla en tiempo de ejecución cuando se inicia la Actividad. La aplicación de Android, básicamente, sólo muestra una pila de llamadas con una excepción "NoClassDefFoundError com.myteam.myproject.MyProject".

La excepción parece ser causada por su superclase (o la superclase 'interfaz) mientras carga / resuelve como la salida de LogCat revela:

 12-20 19:51:51.897: D/ddm-heap(218): Got feature list request 12-20 19:51:52.207: I/dalvikvm(218): Failed resolving Lcom/myteam/myproject/Game; interface 18 'Lcom/myteam/engine/IGame;' 12-20 19:51:52.217: W/dalvikvm(218): Link of class 'Lcom/myteam/myproject/Game;' failed 12-20 19:51:52.227: W/dalvikvm(218): Unable to resolve superclass of Lcom/myteam/myproject/MyProject; (52) 12-20 19:51:52.227: W/dalvikvm(218): Link of class 'Lcom/myteam/myproject/MyProject;' failed 12-20 19:51:52.227: E/dalvikvm(218): Could not find class 'com.myteam.myproject.MyProject', referenced from method com.myteam.myproject.android.MyAndroidActivity.onCreate 12-20 19:51:52.227: W/dalvikvm(218): VFY: unable to resolve new-instance 54 (Lcom/myteam/myproject/MyProject;) in Lcom/myteam/myproject/android/Youcode_AndroidActivity; 12-20 19:51:52.227: D/dalvikvm(218): VFY: replacing opcode 0x22 at 0x0008 12-20 19:51:52.227: D/dalvikvm(218): Making a copy of Lcom/myteam/myproject/android/Youcode_AndroidActivity;.onCreate code (88 bytes) 

He intentado agregar los dos primeros proyectos bajo la configuración de proyecto "Build Path / Order and Export" de Eclipse del proyecto de juego android como se describe en otros foros y foros, pero no cambia nada.

Mi corazonada es que los ajustes del manifiesto o del proyecto necesitan otra mención de las dependencias del paquete / de la clase para el empaquetado o el tiempo de ejecución de apk. ¿Algunas ideas?

Tengo una aplicación Android / Java de tres niveles, casi igual que tú:

  1. Proyecto Java sólo para comunicación de red de bajo nivel
  2. Proyecto de Java sólo para abstraer las características del proyecto de bajo nivel
  3. aplicación Android

Cada cosa es un proyecto separado de Eclipse contenido en un solo espacio de trabajo.

Esto es lo que debe hacer:

  1. Bajo las propiedades del proyecto de la aplicación-> Java Build Path-> Projects, agregue los proyectos de Java solamente
  2. En las propiedades del proyecto de la aplicación-> Java Build Path-> Order and Export, compruebe los proyectos Java-only (que los marcan para la exportación)

Ahora, la aplicación debe crearse y ejecutarse sin excepciones VFY o errores VFY como los siguientes:

 03-27 21:10:17.120: W/dalvikvm(420): VFY: unable to find class referenced in signature (Labstractionlayer/BaseStationManager;) 03-27 21:10:17.120: W/dalvikvm(420): VFY: unable to find class referenced in signature (Labstractionlayer/BaseStationManager;) 03-27 21:10:17.160: I/dalvikvm(420): Failed resolving Lcom/demo/log/AndroidLogWrapper; interface 253 'Lcommon/Logger/LogWrapper;' 03-27 21:10:17.160: W/dalvikvm(420): Link of class 'Lcom/demo/log/AndroidLogWrapper;' failed 03-27 21:10:17.160: E/dalvikvm(420): Could not find class 'com.demo.log.AndroidLogWrapper', referenced from method com.demo.Application.onCreate 03-27 21:10:17.160: W/dalvikvm(420): VFY: unable to resolve new-instance 218 (Lcom/demo/log/AndroidLogWrapper;) in Lcom/demo/Application; 03-27 21:10:17.170: D/dalvikvm(420): VFY: replacing opcode 0x22 at 0x0003 03-27 21:10:17.170: D/dalvikvm(420): VFY: dead code 0x0005-003c in Lcom/demo/Application;.onCreate ()V 03-27 21:10:17.170: D/AndroidRuntime(420): Shutting down VM 03-27 21:10:17.170: W/dalvikvm(420): threadid=1: thread exiting with uncaught exception (group=0x40015560) 03-27 21:10:17.180: E/AndroidRuntime(420): FATAL EXCEPTION: main 03-27 21:10:17.180: E/AndroidRuntime(420): java.lang.NoClassDefFoundError: com.demo.log.AndroidLogWrapper 

BTW, antes de ADT r17, sólo se necesita para realizar el paso 1 anterior (añadir los proyectos sólo de Java). Pero a partir de r17, también debe realizar el paso 2 (marque los proyectos de Java sólo para la exportación).

Agregue el nombre de sus proyectos dependientes al archivo .claspath de su proyecto android. como eso:

 <?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" path="src"/> <classpathentry kind="src" path="gen"/> <classpathentry combineaccessrules="false" kind="src" path="/DependentProject1"/> <classpathentry combineaccessrules="false" kind="src" path="/DependentProject2"/> <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/> <classpathentry kind="output" path="bin"/> </classpath> 

He estado tratando de encontrar una solución simple para este tiempo atrás, por lo que puedo decir, la única manera de hacer ADT exportar el apk final con las clases de biblioteca dependiente es añadir explícitamente todo su lib.jar externo (generado a partir de su Otros proyectos) en la ruta de construcción del proyecto de Android.

La versión actual del complemento Eclipse ADT tiene un ciclo de vida de compilación predefinido muy inflexible (específicamente en el paso de dexicación), aparentemente no admite grupos de proyectos distintos de los tres tipos de proyectos de Android juntos (clásico, biblioteca y prueba). En otras palabras, ADT no sabe cómo construir su proyecto de Android con un proyecto dependiente de java regular bajo la ruta de construcción y agrega automáticamente el proyecto lib.jar generado por dependiente en la ruta de construcción del proyecto principal (aunque agregue a Order Y la lista de exportación), a menos que usted agregue explícitamente el lib.jar externo en él. Supongamos que agrega C: \ workspace \ game \ target \ game.jar y C: \ workspace \ engine \ target \ engine.jar en la ruta de construcción del proyecto de tu juego android, el comando para generar tu archivo dex debería ser algo como esto:

 java [-Xmx1024M, -jar, C:\android-sdk-r16\platform-tools\lib\dx.jar, --dex, --output=C:\workspace\android-game\target\classes.dex, C:\workspace\android-game\target\classes, C:\workspace\game\target\game.jar, C:\workspace\engine\target\engine.jar] 

Si planea adoptar algunas herramientas externas de construcción para administrar el ciclo de vida de su proyecto, sé que Maven ofrece una configuración más flexible en el ciclo de vida de la compilación de Android. Es compatible con el proyecto de varios módulos (agrupación de proyectos) y puede manejar la dependencia regular del proyecto de Java correctamente.

Mi conocimiento se basa en Eclipse, Mirando hacia adelante para escuchar algunos ruidos de la fuente de Android u otro usuario sofisticado IDE.

Actualización de ADT 17.0.0:

La última versión SDK r17 con ADT 17.0.0 afirma manejar correctamente estos casos de uso ahora:

Cambios específicos de Eclipse

El contenedor de classpath dinámico denominado "Proyectos de biblioteca" ha cambiado de nombre a "Dependencias de Android" ya que ahora contiene más que proyectos de biblioteca.

Ahora, el contenedor también se rellenará con proyectos de Java que sean referenciados por Proyectos de biblioteca. Si esos proyectos de Java también hacen referencia a otros proyectos de Java y / o archivos jar, se agregarán automáticamente (también se admiten archivos jar referenciados a través de bibliotecas de usuarios).

Importante: esto sólo ocurre si las referencias se configuran para exportarse en el proyecto de referencia. Tenga en cuenta que este no es el valor predeterminado cuando se agrega un proyecto o un archivo jar a una ruta de construcción de proyecto. Los proyectos de biblioteca (y el contenido de sus archivos libs / * .jar) siempre se exportan. Este cambio sólo afecta a los proyectos de Java y sus propios archivos jar.

De nuevo, los duplicados (tanto los proyectos como los archivos jar) son detectados y eliminados.

Compruebe el changelog .

He encontrado este hilo y realmente funcionó para mí sólo asegúrese de comprobar el dependiente proyecto

Probando el proyecto de Android con jar cifras

La ruta de construcción de Java del proyecto de nivel medio incluye el proyecto de bajo nivel, supongo. ¿Ha comprobado el proyecto de bajo nivel (pestaña "Pedido y exportación")? De lo contrario, la dependencia de proyecto de bajo nivel no se reenvía al proyecto de alto nivel, excluyendo IGame del APK, lo que realmente desencadena el error.

Sin embargo, esta solución AFAIK no funcionará si sus proyectos contienen cosas específicas de Android, como recursos y similares.

Dudo de ti y de tu proyecto. Desde mi punto de vista, veo que tiene un buen diseño. ¿Pero por qué está trabajando con Build Path / Order and Export ? Honestamente nunca he ido a esa pestaña desde el primer día que trabajé con Eclipse.

Para importar archivos jar como bibliotecas, utilice la pestaña Libraries -> add Jars externos.

Y lo siento no sé acerca de la programación de juegos, esto es sólo una sugerencia: asegúrese de que su motor se ajuste a lo que Android soporta. Por ejemplo, Android no admite javax.imageio . Si no, la aplicación se puede compilar con jarras externas, pero se puede estrellar en tiempo de ejecución.

Sé que ésta es una vieja pregunta, pero encontré una nueva manera de venir a través de este error que puede ayudar a otros con actualizaciones recientes.

Conseguí este error de usar una declaración del interruptor / caso en el R.id. "Constantes". Las últimas actualizaciones ya no consideran que las declaraciones de R.java sean constantes en el código aunque se declaren como definitivas. Lo que sucede es que el .apk se compilará e instalará pero producirá esos errores de Lcom.

Para resolver esto (en Eclipse) se pone el cursor en la declaración de switch y se usa Ctrl + 1 para convertir el switch a una lista de if then else 's. Tenga en cuenta que si tiene pausas anidadas dentro de una instrucción de caso , tendrá que volver a escribir ese bloque de código (probablemente con otro extra).

  • Cree la Biblioteca de Archivos de Android (AAR) con maven solamente
  • ¿Cómo puedo crear una suite de pruebas de Android que sólo ejecuta pruebas especificadas en una o más clases?
  • Android SDK ADT no coincide pero no encuentra la actualización
  • Mejor editor de diseño XML de Android que el de Eclipse
  • Error al copiar el manifiesto
  • Cambió la imagen de splash.png pero no cambia en el emulador
  • Agregar API de Google al proyecto existente de eclipse
  • Problemas al instalar herramientas de desarrollo de Android en Eclipse 3.7
  • 'Dependencia de plantilla no soportada: Actualiza tu complemento de Android Eclipse' con SDK Tools v22
  • Principiante: usando variables definidas en una clase en otra clase
  • Error de "intento no se puede resolver a un tipo" en eclipse
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.