2012-05-03 2 views
5

Sono bloccato da circa 2 ore su un problema che ho pensato fosse facile da risolvere. Sto costruendo un selettore data-ora personalizzato per la piattaforma Android e, a causa della lentezza delle classi standard java.util.Calendar e java.util.Date, ho deciso di utilizzare la libreria JODA.Android java.lang.NoClassDefFoundError che utilizza librerie JODA

Purtroppo non ho esperienza con i riferimenti "JAR" (perdonami ... vengo da COM e .NET assembly world =) ...), ma apprendo alcuni suggerimenti su Internet ma ovviamente sembrano sbagliarmi ... Questi sono i passi che ho preso per utilizzare la libreria nel mio progetto:

  1. scaricare l'ultima biblioteca JODA 2.1
  2. creare la cartella 'lib' nella mia cartella del progetto
  3. Add ' joda-time-2.1.jar 'alla cartella' lib '.
  4. Aggiungere la libreria 'joda-time-2.1.jar' al percorso di generazione.
  5. Add 'Joda-tempo-2.1-javadoc.jar' e 'Joda-tempo-2.1-sources.jar' a cartella 'lib'
  6. Impostare le librerie di cui sopra come 'Allegati sorgente Java' e 'posizione javadoc 'per la libreria di riferimento 2.1 joda-time.
  7. Utilizzare la nuova libreria nel mio codice (ehm ehm 'intelli-sense' e il compilatore non genera alcun errore o avviso)
  8. Avvia il debug su dispositivo reale o virtuale.

Quando si tratta della seguente riga (il primo che utilizza JODA BTW), il debug si ferma:

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

E restituisce il seguente stack trace:

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 

qualcuno può aiutare me? Grazie in anticipo!

+0

Qual è la dichiarazione di importazione che usi per DateTime? – Sam

+0

Ho avuto lo stesso problema dopo aver aperto il mio progetto su un altro computer, Eclipse viene compilato rispetto alla libreria ok ma si blocca alla prima chiamata al costruttore DateTime della libreria JodaTime. – Luke

risposta

7

Rinominare la cartella lib in libs. A partire da ADT Tools 17 gli externals jars vengono solo pacchettizzati nell'apk se si trovano all'interno di questa cartella. In alternativa puoi andare su "configura percorso di costruzione .." -> "Ordina ed esporta" e fai clic sulla casella accanto al vaso.

+0

Sì, ce l'ho! Ho sbagliato il nome della cartella ... rinominandolo "libs" invece di "lib" funziona molto bene !! ma ho notato una grande lentezza quando uso il costruttore DateTime().Ad esempio, per creare un nuovo oggetto DateTime il mio Samsung Omnia 2 con porting O2Droid (basato sulla versione Froyo), richiede circa 30 secondi. Il mio tablet Acer A500 con Honeycomb richiede circa 3 secondi ... è normale ??? questo problema può essere correlato al metodo che uso per fare riferimento a un JAR? qualcuno sa qualche trucco per accelerare le prestazioni con questa libreria? – GiveEmTheBoot

+0

Si potrebbe voler controllare questa discussione per ottenere aiuto con l'avvio lento: http://stackoverflow.com/questions/5059663/android-java-joda-date-is-slow – sdouglass

1

Per gli altri che potrebbero essere alla ricerca di una soluzione, c'è un'altra possibile causa che ho appena scoperto: Open Progetto> Proprietà> Java Build Path> Biblioteche e verificare se JodaTime è sotto Android Dipendenze o Android privato Librerie. Quindi assicurarsi che l'opzione corrispondente sia selezionata nella scheda Ordine ed esportazione. Dovevo controllare le librerie private Android (dove era elencato JodaTime) per farlo funzionare.

Presumo che questo si applichi anche a problemi simili e non è necessariamente correlato a JodaTime.