Pregunta NoClassDefFoundError para el código en una biblioteca Java en Android


Estoy experimentando un error muy a menudo entre mis usuarios. La aplicación falla durante el inicio. Cuando se supone que la actividad principal debe cargarse, aparentemente la máquina virtual no puede encontrar la clase. No puedo entender por qué. La arquitectura de la aplicación es que hay un proyecto común que usan tanto mi versión gratuita como pro. No sé si es relevante. Ver el seguimiento de la pila a continuación. ¿Alguna idea?

java.lang.NoClassDefFoundError: com.android.common.MainActivity
at com.mycompany.myapp.Splash.onCreate(Splash.java:23)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
at android.app.ActivityThread.access$1500(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: com.android.common.MainActivity in loader     dalvik.system.PathClassLoader[/system/framework/com.google.android.maps.jar:/data/app/com.android.pro-1.apk]

Editar: Gracias por el comentario a continuación, Richard. Ahora he cambiado com.android.Splash a otra cosa. No era el nombre de clase real de todos modos. Mi error...!


75
2017-12-30 10:47


origen


Respuestas:


Tuve el mismo problema, hice lo siguiente para solucionar el problema.

  1. Vaya a "Propiedades" del proyecto.
  2. Seleccione "Ruta de compilación de Java"
  3. Seleccione la pestaña "Ordenar y exportar"
  4. Debería ver las rutas y dependencias "src" y "gen" del proyecto seleccionado aquí.
  5. El orden en que se enumeraron fue primero "src" y luego "gen"
  6. Los cambio, para que la carpeta "gen" se construya antes de "src"

gen - código automatizado en el proyecto (de dependencias y referencias)
src - código fuente en el proyecto

No hubo necesidad de reiniciar el Eclipse. Simplemente comenzó a funcionar.

Honestamente, nunca he probado "Android Tools> Fix Project Properties", a veces podría estar haciendo lo mismo. No sé, acabo de hacer lo anterior después de ver el mensaje de error, pensando que algo anda mal con las rutas de compilación.


Editar


Más tarde no fue suficiente, estaba recibiendo el error nuevamente. Luego "verifiqué" todas las dependencias enumeradas en esa vista. Ahora funciona de nuevo. Hasta aquí todo bien. Mantendré esto actualizado si falla nuevamente.

FYI: en mi último intento, probé "Herramientas de Android> Reparar las propiedades del proyecto", pero no funcionó para mí.


126
2017-10-03 05:19



Actualmente estoy usando SDK 20.0.3 y ninguna de las soluciones anteriores funcionó para mí.

Pude hacer que las cosas funcionen

  • Hacer clic derecho en el proyecto de Android
  • Luego seleccionando Ruta de compilación -> Fuente de enlace para mostrar el cuadro de diálogo Fuente de enlace.
  • Luego, especifiqué la carpeta 'src' del proyecto Java y le asigné un nombre distinto al predeterminado de 'src' (por ejemplo, 'src2').
  • Ahora puede hacer clic con el botón derecho en -> eliminar la nueva carpeta 'src2'.

Esto trajo este creado archivos de clase de Java que se compilaron para la máquina virtual de Dalvik en lugar de la máquina virtual de Java cuando se construyó el proyecto de Android. Esto permitió que los archivos de la clase Java en el archivo jar de la Biblioteca Android se transfirieran al dexing cuando se creó el archivo .apk del proyecto Android. Ahora, cuando se ejecutó la aplicación, se encontraron las clases del proyecto Java en lugar de arrojar un Java.lang.NoClassDefFoundError.

Si desea utilizar un archivo jar en lugar de vincular el origen, deberá crear un proyecto de biblioteca Android. (Un proyecto de Android con 'es una biblioteca' marcado en Propiedades -> Android). Luego necesitará vincular la fuente del Proyecto Java al proyecto de la Biblioteca Android como se describe arriba o copiar los archivos fuente de la carpeta 'src' de el Proyecto Java a la carpeta 'src' del proyecto de la biblioteca Android. Construye el proyecto de la biblioteca de Android. Luego podrá copiar el archivo jar de Android Project que se creó en la carpeta 'libs' de la carpeta de Android porque los archivos de clase en él se compilaron para la VM Davlik en lugar de la VM Java cuando se creó el proyecto Android. Esto permite que los archivos de la clase Java en el archivo jar de la biblioteca de Android se transfieran a través de dexing cuando se crea el archivo .apk del proyecto Android. Ahora, cuando se ejecuta la aplicación, se encontrarán las clases del proyecto Java en lugar de lanzarse Java.lang.NoClassDefFoundError.


18
2018-06-21 06:13



Intente ir a Proyecto -> Propiedades -> Ruta de compilación de Java -> Ordenar y exportar y asegúrese de que las bibliotecas privadas de Android estén marcadas para su proyecto y para todos los demás proyectos de biblioteca que esté utilizando. Obtuve la solución siguiendo el siguiente enlace Proyecto Android NoClassDefFoundError?


17
2018-03-28 10:13



En caso de que ayude a alguien, me enfrenté al mismo problema. Mi archivo jar estaba en el directorio libs y el jar se agregó a la ruta de compilación. Todavía estaba arrojando esa excepción.

Limpié el proyecto y funcionó para mí.

Eclipse -> Proyecto -> Limpiar -> Seleccionar el proyecto y limpiar


8
2017-07-04 05:46



Intenté todas las soluciones mencionadas anteriormente, pero no funcionó para mí, Esto es lo que hice para hacerlo project-> config build path-> order and export-> move dependent project en la parte superior


7
2017-08-13 23:50



Este error también se genera cuando crea una aplicación que usa la API de Google (como Maps) pero la ejecuta en un dispositivo que se dirige a la API de Android.


6
2018-04-21 10:20



Encontré este NoClassDefFoundError cuando utilicé java.nio.charset.StandardCharsets.

La razón es que StandardCharsets no ha existido hasta JRE 1.7. Si configuro la versión de compilación java en 1.7, Eclipse se quejó de que "Android requiere un nivel de cumplimiento del compilador de 5.0 o 6.0". Así que lo arreglé haciendo clic con el botón derecho en el nombre del proyecto-> Herramientas de Android-> Reparar las propiedades del proyecto. Está compilado con JRE1.6.

Sin embargo, porque StandardCharsets no ha existido hasta 1.7. Informó NoClassDefFoundError cuando lo ejecuté.

No me he dado cuenta de esto hasta después de probar muchos otros métodos, incluida la reinstalación de JDK. La verdadera razón está claramente expresada por el significado de NoClassDefFoundError: la clase no se puede encontrar en tiempo de ejecución aunque pasó la compilación.

La conclusión general es que, siempre que Android no funcione con JRE 1.7, si utiliza cualquier característica nueva proporcionada desde 1.7, encontrará este error.

¡Mi solución es que copié esos códigos fuente en mi código!


5
2017-12-30 10:54



La descripción NoClassDefFoundError es, desde la etiqueta SO:

El error de Java arrojado si la máquina virtual de Java o un cargador de clases   instancia intenta cargar en la definición de una clase (como parte de   llamada al método normal o como parte de la creación de una nueva instancia utilizando el nuevo   expresión) y no se pudo encontrar ninguna definición de la clase. los   definición de clase buscada existía cuando la ejecución actual   clase fue compilada, pero la definición ya no se puede encontrar.

O mejor:

NoClassDefFoundError en Java se produce cuando Java Virtual Machine no es   capaz de encontrar una clase particular en tiempo de ejecución que estuvo disponible durante   tiempo de compilación.

de esta página. Compruébalo, hay algunas maneras de resolver el error. Espero que ayude.


4
2017-11-27 15:24



Para mí, este problema estaba relacionado con la API que estaba usando no implementada. Por ejemplo, usé un ZSDK_API.jar como una referencia.

Para solucionar el problema tuve que hacer clic derecho en el proyecto y seleccionar propiedades. Desde JAVA BUILD PATH, tuve que agregar la API que no se estaba implementando. Esto fue extraño ya que la aplicación arrojaba la clase MainActivity no encontrada y en realidad el error fue causado por la clase DiscoveryHandler que no se encontró.

Espera que esto ayude a alguien.


3
2017-10-26 13:19



En mi caso, estaba tratando de agregar una clase java normal (de un proyecto java normal) compilada con jre 1.7 a un proyecto de aplicación para Android compilado con jre 1.7.

La solución fue recompilar esa clase normal de Java con jre 1.6 y agregar referencias al proyecto de la aplicación de Android (compilado con jre 1.6 también) como de costumbre (en orden de tabulación y exportación asegúrese de verificar la clase, el proyecto, etc.).

El mismo proceso, cuando se utiliza una biblioteca de Android para hacer referencia a las clases externas normales de Java.

No sé lo que está mal con jre 1.7, al compilar las clases normales de Java de un proyecto Java normal e intentar hacer referencia a ellas en la aplicación de Android o en los proyectos de la biblioteca de Android.

Si no utiliza las clases normales de Java (de un proyecto Java normal), no necesita cambiar a jre 1.6.


3
2018-06-27 13:05