2012-05-03 14 views
5

Estoy atascado desde aproximadamente 2 horas en un problema que pensé que era fácil de resolver. Estoy construyendo un selector de fecha y hora personalizado para la plataforma de Android y, debido a la lentitud de las clases java.util.Calendar y java.util.Date estándar, decidí usar la biblioteca de JODA.Android java.lang.NoClassDefFoundError utilizando las bibliotecas JODA

Desafortunadamente no tengo experiencia con las referencias 'JAR' (perdóneme ... vengo de COM y ensamblados .NET world =) ...), pero aprendo algunos consejos en internet pero obviamente parecen estar equivocado ... Estos son los pasos que di a utilizar la biblioteca en mi proyecto:

  1. descargar la última biblioteca JODA 2.1
  2. crear la carpeta 'lib' en mi proyecto carpeta
  3. Add ' joda-time-2.1.jar 'a la carpeta' lib '.
  4. Agregue la biblioteca 'joda-time-2.1.jar' a la ruta de compilación.
  5. Agregue 'joda-time-2.1-javadoc.jar' y 'joda-time-2.1-sources.jar' a la carpeta 'lib'
  6. Configure las bibliotecas anteriores como 'adjuntos de origen de Java' y 'ubicación de javadoc 'para la biblioteca referenciada joda-time-2.1.
  7. Utilice la nueva biblioteca en mi código (el ehm ehm 'intelli-sense' y el compilador no arrojan ningún error o advertencia)
  8. Comience a depurar en un dispositivo real o virtual.

Cuando se trata de la línea siguiente (el primero que utiliza JODA por cierto), depuración se detiene:

DateTime newDate = new DateTime(2012, 5, 3, 12, 0, 0); 

y devuelve el seguimiento de pila:

05-03 19:09:14.349: E/AndroidRuntime(4071): java.lang.NoClassDefFoundError: org.joda.time.DateTime 
05-03 19:09:14.349: E/AndroidRuntime(4071):  at it.paganel.droidMessageExport.Control.TimePickerControl.SetTimePart(TimePickerControl.java:83) 
05-03 19:09:14.349: E/AndroidRuntime(4071):  at it.paganel.droidMessageExport.Control.TimePickerControl.onClick(TimePickerControl.java:116) 
05-03 19:09:14.349: E/AndroidRuntime(4071):  at android.view.View.performClick(View.java:2454) 
05-03 19:09:14.349: E/AndroidRuntime(4071):  at android.view.View$PerformClick.run(View.java:9030) 
05-03 19:09:14.349: E/AndroidRuntime(4071):  at android.os.Handler.handleCallback(Handler.java:587) 
05-03 19:09:14.349: E/AndroidRuntime(4071):  at android.os.Handler.dispatchMessage(Handler.java:92) 
05-03 19:09:14.349: E/AndroidRuntime(4071):  at android.os.Looper.loop(Looper.java:123) 
05-03 19:09:14.349: E/AndroidRuntime(4071):  at android.app.ActivityThread.main(ActivityThread.java:4641) 
05-03 19:09:14.349: E/AndroidRuntime(4071):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-03 19:09:14.349: E/AndroidRuntime(4071):  at java.lang.reflect.Method.invoke(Method.java:521) 
05-03 19:09:14.349: E/AndroidRuntime(4071):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:870) 
05-03 19:09:14.349: E/AndroidRuntime(4071):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628) 
05-03 19:09:14.349: E/AndroidRuntime(4071):  at dalvik.system.NativeStart.main(Native Method) 
05-03 19:09:14.349: E/AndroidRuntime(4071): Caused by: java.lang.ClassNotFoundException: org.joda.time.DateTime in loader dalvik.system.PathClassLoader[/data/app/it.paganel.droidMessageExport-2.apk] 
05-03 19:09:14.349: E/AndroidRuntime(4071):  at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243) 
05-03 19:09:14.349: E/AndroidRuntime(4071):  at java.lang.ClassLoader.loadClass(ClassLoader.java:573) 
05-03 19:09:14.349: E/AndroidRuntime(4071):  at java.lang.ClassLoader.loadClass(ClassLoader.java:532) 
05-03 19:09:14.349: E/AndroidRuntime(4071):  ... 13 more 

que alguien pueda ayudar ¿yo? ¡Gracias de antemano!

+0

¿Cuál es la instrucción de importación que utiliza para DateTime? – Sam

+0

He estado teniendo el mismo problema al abrir mi proyecto en una computadora diferente, Eclipse compila en contra de la biblioteca, pero se bloquea en la primera llamada al constructor DateTime de la biblioteca JodaTime. – Luke

Respuesta

7

Cambie el nombre de la carpeta lib a libs. A partir de las herramientas ADT, 17 jarras externas solo se empaquetan en la apk si están dentro de esta carpeta. Alternativamente, puede ir a "configurar la ruta de compilación ..." -> "Ordenar y exportar" y hacer clic en la casilla de verificación junto al contenedor.

+0

Sí, lo tengo! Me equivoqué con el nombre de la carpeta ... cambiarle el nombre a "libs" en lugar de "lib" ¡funciona muy bien! pero noté una gran lentitud cuando uso el constructor DateTime().Por ejemplo, para crear un nuevo objeto DateTime, mi Samsung Omnia 2 con puerto O2Droid (basado en la versión de Froyo) tarda unos 30 segundos. Mi tableta Acer A500 con Honeycomb, toma alrededor de 3 segundos ... ¿es normal? ¿Puede este problema estar relacionado con el método que uso para hacer referencia a un JAR? ¿alguien sabe algún truco para acelerar el rendimiento con esta biblioteca? – GiveEmTheBoot

+0

Es posible que desee consultar esta discusión para obtener ayuda con el inicio lento: http://stackoverflow.com/questions/5059663/android-java-joda-date-is-slow – sdouglass

1

Para otras personas que podrían estar buscando una solución, no es otra posible causa que acabo de descubrir: Abrir Proyecto> Propiedades> Java Build Path> Bibliotecas y comprobar si JodaTime está bajo Dependencias Android o Android privada Bibliotecas. A continuación, asegúrese de que la opción correspondiente esté marcada en la pestaña Pedido y exportación . Tuve que verificar Android Private Libraries (donde JodaTime estaba en la lista) para que funcione.

Supongo que esto se aplica a problemas similares, también, y no está necesariamente relacionado con JodaTime.

Cuestiones relacionadas