2010-03-16 11 views
7

thể trùng lặp:
NoClassDefFoundError - Eclipse and AndroidPhương pháp tiếp cận để sửa lỗi NoClassDefFoundError?

tôi nhìn thấy câu hỏi này được nhận được yêu cầu rất nhiều trong nhiều hoàn cảnh khác nhau. Có lẽ chúng ta có thể thiết lập một số chiến lược để định vị và sửa chữa nó? Bản thân tôi có vẻ như bị ném ra khi một lớp có thể nhìn thấy ở thời gian biên dịch nhưng không phải lúc chạy ... làm thế nào điều này có thể xảy ra ?.

Trong trường hợp của tôi, tôi đang phát triển một ứng dụng sử dụng API Google, trong Eclipse, cho nền tảng Android. Tôi đã cấu hình Project Properties/Java Build Path/Libraries để bao gồm các gdata .jars và tất cả đều tốt. Khi tôi thực hiện trong giả lập tôi nhận được một lực lượng gần gũi và logcat cho thấy một NoClassDefFoundError trên một mới đơn giản ContactsService ("myApp"); Tôi cũng đã thử một CalendarService mới ("myApp") với cùng một kết quả.

Có thể hoặc mong muốn liên kết tĩnh tại thời gian biên dịch để tránh sự cố không?

Cách gắn kết động của thư viện tiện ích có thể hoạt động trong môi trường di động được không? Hoặc là nó phải được ràng buộc vào .apk của tôi hoặc người nào khác tôi cần phải "cài đặt" nó? ... hmmm.

Lời khuyên được đánh giá cao.

Trả lời

9

Có vẻ như điều này được ném ra khi một lớp là nhìn thấy ở thời gian biên dịch nhưng không phải ở thời gian chạy ... cách này có thể xảy ra?

Đường dẫn lớp xây dựng có thể bao gồm các tệp JAR không được đóng gói trong APK.

Có thể hoặc mong muốn liên kết tĩnh tại thời gian biên dịch thành tránh sự cố?

Có thể, mong muốn và cần thiết.

Ngoài Eclipse, bạn chỉ cần đặt các JAR bạn cần trong libs/ trong dự án của bạn, biên dịch với Ant và bạn đã hoàn tất.

Bên trong Eclipse, một mẫu mà tôi đã sử dụng thành công là đặt các JAR bạn cần vào libs/ trong dự án của bạn, thêm chúng dưới dạng JAR vào đường dẫn xây dựng (lưu ý: không phải các JAR bên ngoài) và chúng được đóng gói như một phần của APK. Tuy nhiên, lưu ý rằng tôi không đích thân sử dụng Eclipse, và vì vậy kinh nghiệm của tôi với nó bị giới hạn.

+0

Với plugin Eclipse cho phát triển Android, bất kỳ lọ nào được bao gồm trong đường dẫn xây dựng của dự án được đóng gói như một phần của APK (miễn là bạn đang sử dụng plugin để tạo APK). Các lọ không phải nằm trong dự án, hoặc trong một thư mục nào đó hoặc bất kỳ thứ gì. –

+0

Tuy nhiên, đã có một loạt các khiếu nại gần đây về điều này. Một lần nữa, tôi không phải là người dùng Eclipse. Tôi đã thấy rằng có "Thêm JAR" và "Thêm JAR bên ngoài" trên tab hộp thoại đường dẫn xây dựng - có thể có một số tác động nếu bạn chọn "Thêm JAR bên ngoài" không? – CommonsWare

+0

Tôi đã sử dụng "Thêm External JAR", vâng. Tôi đã tạo một thư mục libs và chuyển trực tiếp các cài đặt gdata vào nó. Sau đó, tôi sử dụng "Thêm JAR" và các lọ xuất hiện như "Thư viện tham chiếu" và trình biên dịch là hạnh phúc. Sau đó, tôi đã làm một dự án sạch, khởi động lại Eclipse và trình mô phỏng, và chạy. Cùng một vấn đề. Grrr. Điều này là kickin tôi .. :) Hình như một lỗi môi trường dev? – DJC

1

Khi tôi nhận được điều này, sự cố thực sự sâu hơn trong hàng đợi; Bộ chuyển đổi Dalvik đã không chuyển đổi được một số thư viện được tham chiếu và Eclipse vẫn cho phép tôi khởi chạy dự án.

Kiểm tra bảng điều khiển SDK Android để xem có bất kỳ lỗi nào được báo cáo hay không.

1

Trong trường hợp của tôi, tôi đang sử dụng thư viện của riêng mình (MyLib) được chia sẻ giữa 2 ứng dụng. Ứng dụng A đã bị đóng khi tôi thêm một lớp mới vào thư viện.

Khi tôi mở ứng dụng A để làm việc trên nó, Eclipse đã nhận ra lớp mới và tôi có thể tham khảo nó. Tuy nhiên trên chạy tôi đã nhận được lỗi.

Hóa ra là thư mục thư viện đã nhập trong ứng dụng A (có tên là MyLib_src) không phản ánh những thay đổi được thực hiện cho dự án thư viện của tôi (MyLib).

  • Để giải quyết vấn đề này, tôi đã làm mới ứng dụng A, những thay đổi được phản ánh và Android có thể xây dựng dự án của tôi một cách chính xác.

Tôi đã không tìm thấy tham chiếu đến phiên bản này của sự cố, vì vậy tôi nghĩ rằng tôi sẽ thêm nó vào danh sách này.

2

Đối với những người gặp sự cố, tôi đã gặp lỗi tương tự với ứng dụng của mình. những gì tôi đã làm để giải quyết đó là tạo một dự án mới và sao chép tài nguyên và thư mục nguồn của tôi cùng với tệp kê khai của tôi vào dự án mới (tôi đã xóa trước những dự án mới được tạo) và thì đấy.