2012-05-03 38 views
5

Tôi bị kẹt trong khoảng 2 giờ về một vấn đề mà tôi nghĩ rằng nó rất dễ giải quyết. Tôi đang tạo bộ chọn ngày giờ tùy chỉnh cho nền tảng Android và, do sự chậm chạp của các lớp java.util.Calendar và java.util.Date chuẩn, tôi quyết định sử dụng thư viện JODA.Android java.lang.NoClassDefFoundError bằng cách sử dụng thư viện JODA

Thật không may là tôi không có kinh nghiệm với các tham chiếu 'JAR' (tha thứ cho tôi ... tôi đến từ COM và .NET assembly thế giới =) ...), nhưng tôi tìm hiểu một số mẹo trên internet nhưng rõ ràng là là sai ... Đây là những bước tôi lấy để sử dụng thư viện trong dự án của tôi:

  1. Tải thư viện Joda mới nhất 2.1
  2. Tạo thư mục 'lib' vào thư mục dự án của tôi
  3. Add ' joda-time-2.1.jar 'vào thư mục' lib '.
  4. Thêm thư viện 'joda-time-2.1.jar' vào đường dẫn xây dựng.
  5. Thêm 'joda-time-2.1-javadoc.jar' và 'joda-time-2.1-sources.jar' vào thư mục 'lib'
  6. Đặt thư viện ở trên là 'tệp đính kèm nguồn java' và 'vị trí javadoc 'cho thư viện tham chiếu joda-time-2.1.
  7. Sử dụng thư viện mới vào mã của tôi (ehm ehm 'intelli-sense' và trình biên dịch không ném bất kỳ lỗi hoặc cảnh báo nào)
  8. Bắt đầu gỡ lỗi trên thiết bị thực hoặc ảo.

Khi nói đến dòng sau (người đầu tiên sử dụng Joda BTW), debug dừng:

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

Và trả về stack trace sau:

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 

Ai đó có thể giúp tôi? Cảm ơn bạn trước!

+0

Tuyên bố nhập khẩu mà bạn sử dụng cho DateTime là gì? – Sam

+0

Tôi đã gặp vấn đề tương tự khi mở dự án của mình trên một máy tính khác, Eclipse biên dịch ngược lại với thư viện ok nhưng nó bị treo tại cuộc gọi đầu tiên tới hàm tạo DateTime của thư viện JodaTime. – Luke

Trả lời

7

Đổi tên thư mục lib thành libs. Công cụ ADT 17 lọ bên ngoài chỉ được đóng gói vào gói ứng dụng nếu chúng nằm trong thư mục này. Hoặc bạn có thể đi đến "định cấu hình đường dẫn xây dựng .." -> "Đặt hàng và xuất" và nhấp vào hộp kiểm bên cạnh bình.

+0

Vâng tôi đã hiểu rồi! Tôi sai tên thư mục ... đổi tên nó thành "libs" thay vì "lib" nó hoạt động rất tốt !! nhưng tôi nhận thấy một chậm lớn khi tôi sử dụng DateTime() constructor.Ví dụ, để tạo một đối tượng DateTime mới, Samsung Omnia 2 của tôi với việc chuyển O2Droid (dựa trên bản phát hành Froyo), mất khoảng 30 giây. Máy tính bảng Acer A500 của tôi với Honeycomb, mất khoảng 3 giây ... có bình thường không ??? vấn đề này có thể liên quan đến phương pháp tôi sử dụng để tham chiếu một JAR không? bất cứ ai biết một số thủ thuật để tăng tốc hiệu suất với thư viện này? – GiveEmTheBoot

+0

Bạn có thể muốn kiểm tra cuộc thảo luận này để được trợ giúp khởi động chậm: http://stackoverflow.com/questions/5059663/android-java-joda-date-is-slow – sdouglass

1

Đối với những người khác có thể tìm kiếm một giải pháp, còn có một nguyên nhân có thể mà tôi vừa khám phá: Mở Project> Properties> Java Build Path> Libraries và kiểm tra xem JodaTime là dưới Android Dependencies hoặc Android Private Thư viện. Sau đó, hãy đảm bảo rằng tùy chọn tương ứng được chọn trên tab Đơn hàng và xuất. Tôi phải kiểm tra Thư viện riêng của Android (trong đó JodaTime được liệt kê) để làm cho nó hoạt động.

Tôi cho rằng điều này cũng áp dụng cho các vấn đề tương tự và không nhất thiết liên quan đến JodaTime.

Các vấn đề liên quan