NoClassDefFoundError cho mã trong thư viện Java trên Android


77

Tôi đang gặp một lỗi khá thường xuyên trong số những người dùng của mình. Ứng dụng bị treo khi khởi động. Khi MainActivity được cho là được tải, máy ảo dường như không thể tìm thấy lớp. Tôi không thể tìm ra lý do tại sao. Kiến trúc của ứng dụng là có một dự án chung mà cả phiên bản miễn phí và chuyên nghiệp của tôi đều đang sử dụng. Không biết nó có liên quan không. Xem dấu vết ngăn xếp bên dưới. Có suy nghĩ gì không?

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]

Chỉnh sửa: Cảm ơn cho bình luận bên dưới, Richard. Bây giờ tôi đã đổi com.android.Splashsang một thứ khác. Dù sao thì đó cũng không phải là tên lớp thực. Lỗi của tôi...!


3
Tại sao bạn sẽ không bao giờ cố gắng để tạo ra một lớp trong một gói phần mềm đó đã tồn tại? ( com.android.*). Đó là hình thức xấu, hãy thử thay đổi gói xung quanh.
Richard J. Ross III,

2
Điều này chỉ xảy ra một số lần? hay nó xảy ra mọi lúc khi bạn xây dựng cục bộ?
David T.

2
Nó chỉ xảy ra cho ứng dụng được khởi chạy lên Play. Tôi chưa nhìn thấy nó, vì vậy tôi chỉ thấy dấu vết ngăn xếp được truy xuất trên Crittercism.
kjoelbro

Câu trả lời:


125

Tôi đã gặp vấn đề tương tự, tôi đã làm như sau để khắc phục sự cố.

  1. Chuyển đến "Thuộc tính" của dự án.
  2. Chọn "Đường dẫn xây dựng Java"
  3. Chọn tab "Đặt hàng và xuất"
  4. Bạn sẽ thấy các đường dẫn và phụ thuộc "src" và "gen" của dự án đã chọn tại đây.
  5. Thứ tự cách họ liệt kê đầu tiên là "src" và sau đó là đường dẫn "gen"
  6. Tôi chuyển đổi chúng, để thư mục "gen" được tạo trước "src"

gen - mã tự động trong dự án (từ các phụ thuộc và tham chiếu)
src - mã nguồn trong dự án

Không cần khởi động lại Eclipse. Nó chỉ mới bắt đầu hoạt động.

Thành thật mà nói, tôi chưa bao giờ thử "Công cụ Android> Sửa thuộc tính dự án", đôi khi nó có thể đang làm điều tương tự. Tôi không biết, tôi chỉ làm ở trên sau khi nhìn thấy thông báo lỗi, nghĩ rằng có gì đó sai với các đường dẫn xây dựng.


Biên tập


Sau đó, nó không đủ, tôi đã nhận được lỗi một lần nữa. Sau đó, tôi "kiểm tra" tất cả các phụ thuộc được liệt kê trong chế độ xem đó. Bây giờ nó hoạt động trở lại. Càng xa càng tốt. Tôi sẽ cập nhật điều này nếu nó bị lỗi một lần nữa.

FYI : trong nỗ lực cuối cùng của tôi, tôi đã thử "Công cụ Android> Sửa thuộc tính dự án", nhưng nó không hiệu quả với tôi.


4
ans chỉnh sửa của bạn làm việc cho tôi cũng ... được kéo tóc của tôi trong 2-3 giờ do ClassDefNotFoundError
Prativa

1
Tôi để lại một bình luận mà ai đó có thể tìm thấy một ngày nào đó. Vấn đề của tôi là tham chiếu một lớp từ một dự án thư viện mà lẽ ra không được sử dụng. Thay vào đó, tôi đã tìm thấy lỗi / giải pháp trong tab "Thư viện". Tôi không biết nó có giúp được ai không, nhưng bây giờ nó đã có trên internet.
Andreas Rudolph

Đề xuất chuyển "gen" bằng "src" của bạn đã hoạt động, mọi thứ khác không thành công! Cảm ơn!
Munchies

Giải pháp đó không hiệu quả với tôi. Tuy nhiên, việc di chuyển tệp JAR đã bao gồm lên trên cùng đã làm được. Điều này dành cho AFreeChart. Nói chung, thay đổi thứ tự xây dựng là một phần của câu trả lời có thể giải quyết vấn đề này. NoClassDefFoundError là một vấn đề khó lần ra. Ngoài ra: Tôi thường xóa gen để gây dựng lại. Trong trường hợp đó, gen được chuyển xuống dưới cùng. Điều đó chưa bao giờ là một vấn đề đối với tôi.
Kenneth Evans

đây là thêm một hit n thử mà làm việc cho tôi ..... theo sau nêu 6 bước, sau đó bỏ chọn trang libs của riêng tôi (jackson vv) trong "Trình tự, xuất khẩu" Tab
Shailendra Singh Rajawat

18

Tôi hiện đang sử dụng SDK 20.0.3 và không có giải pháp nào trước đây phù hợp với tôi.

Tôi đã có thể làm cho mọi thứ hoạt động bằng cách

  • Nhấp chuột phải vào dự án Android
  • Sau đó chọn Build Path -> Link Source để xuất hiện hộp thoại Link Source.
  • Sau đó, tôi chỉ định thư mục 'src' của dự án Java và đặt cho nó một tên khác với tên mặc định là 'src' (ví dụ: 'src2').
  • Bây giờ bạn có thể nhấp chuột phải -> xóa thư mục 'src2' mới.

Điều này mang lại các tệp lớp Java đã tạo này được biên dịch cho máy ảo Dalvik thay vì máy ảo Java khi dự án Android được xây dựng. Điều này cho phép các tệp lớp Java trong tệp jar Thư viện Android chạy qua dexing khi dự án Android .apk được tạo. Bây giờ khi ứng dụng được chạy, các lớp dự án Java được tìm thấy thay vì một Java.lang.NoClassDefFoundError được ném ra.

Nếu bạn muốn sử dụng tệp jar thay vì liên kết nguồn, thì bạn sẽ cần tạo một dự án Thư viện Android. (Một Dự án Android với 'is library' được chọn trong Thuộc tính -> Android.) Sau đó, bạn sẽ cần liên kết nguồn của Dự án Java với dự án Thư viện Android như được mô tả ở trên hoặc sao chép các tệp nguồn từ thư mục 'src' của Dự án Java vào thư mục 'src' của dự án Thư viện Android. Xây dựng dự án Thư viện Android. Sau đó, bạn sẽ có thể sao chép tệp jar Dự án Android đã được tạo vào thư mục 'libs' của thư mục Android vì các tệp lớp trong đó được biên dịch cho máy ảo Davlik thay vì máy ảo Java khi dự án Android được xây dựng. Điều này cho phép các tệp lớp Java trong tệp jar Thư viện Android đi qua dexing khi dự án Android .apk được tạo.


17

Hãy thử đi tới Dự án -> Thuộc tính -> Đường dẫn xây dựng Java -> Đặt hàng & Xuất và đảm bảo Thư viện riêng của Android được kiểm tra cho dự án của bạn và cho tất cả các dự án thư viện khác mà bạn đang sử dụng. tôi đã nhận được giải pháp theo liên kết sau NoClassDefFoundError Dự án Android ?


8

Chỉ trong trường hợp nó giúp ích cho ai đó, tôi đã phải đối mặt với vấn đề tương tự. Tệp jar của tôi nằm trong thư mục libs và jar đã được thêm vào đường dẫn xây dựng. Nó vẫn ném ngoại lệ đó.

Tôi chỉ làm sạch dự án và nó đã làm việc cho tôi.

Eclipse -> Dự án -> Làm sạch -> Chọn dự án và dọn dẹp


7

Tôi đã thử tất cả các giải pháp nói trên nhưng không hiệu quả với tôi, Đây là những gì tôi đã làm để hoàn thành dự án-> cấu hình đường dẫn xây dựng-> đặt hàng và xuất-> chuyển dự án phụ thuộc lên đầu


6

Lỗi này cũng được tạo ra khi bạn tạo ứng dụng sử dụng API của Google (chẳng hạn như Maps) nhưng lại chạy ứng dụng đó trên thiết bị nhắm mục tiêu API Android.


1
điều này cuối cùng đã khắc phục sự cố của tôi. bằng cách nào đó, chức năng thuộc tính dự án sửa chữa không thay đổi mục tiêu. i cố định này bằng cách cập nhật google api của tôi
gió bắc

5

Tôi đã gặp lỗi NoClassDefFoundError này khi tôi sử dụng java.nio.charset.StandardCharsets.

Lý do là StandardCharsets chưa tồn tại cho đến JRE 1.7. Nếu tôi đặt phiên bản biên dịch java thành 1.7, Eclipse đã phàn nàn rằng "Android yêu cầu mức tuân thủ trình biên dịch 5.0 hoặc 6.0". Vì vậy, tôi đã sửa nó bằng cách nhấp chuột phải vào tên dự án-> Công cụ Android-> Sửa thuộc tính dự án. Nó được biên dịch với JRE1.6.

Tuy nhiên, vì StandardCharsets mới tồn tại cho đến ngày 1.7. Nó đã báo cáo NoClassDefFoundError khi tôi chạy nó.

Tôi đã không nhận ra điều này cho đến khi thử rất nhiều phương pháp khác bao gồm cài đặt lại JDK. Lý do thực sự được nói rõ ràng bởi ý nghĩa của NoClassDefFoundError: Không thể tìm thấy lớp trong thời gian chạy mặc dù nó đã qua biên dịch.

Kết luận chung là miễn là Android không hoạt động với JRE 1.7, nếu bạn sử dụng bất kỳ tính năng mới nào được cung cấp kể từ 1.7, bạn sẽ gặp phải lỗi này.

Giải pháp của tôi là tôi đã sao chép các mã nguồn đó vào mã của mình!


1
+1 Tôi đã thử sử dụng tệp .jar mà tôi đã biên dịch bằng Java 1.7. Sau khi biên dịch lại jar với Java 1.6, nó hoạt động tốt.
Simon Forsberg

4

Mô tả NoClassDefFoundError, từ thẻ SO:

Lỗi Java được tạo ra nếu Máy ảo Java hoặc một cá thể ClassLoader cố gắng tải trong định nghĩa của một lớp (như một phần của lệnh gọi phương thức thông thường hoặc như một phần của việc tạo một phiên bản mới bằng cách sử dụng biểu thức mới) và không có định nghĩa nào về lớp đó được tìm thấy. Định nghĩa lớp được tìm kiếm tồn tại khi lớp đang thực thi được biên dịch, nhưng không thể tìm thấy định nghĩa nữa.

Hoặc tốt hơn:

NoClassDefFoundError trong Java xảy ra khi Máy ảo Java không thể tìm thấy một lớp cụ thể trong thời gian chạy, lớp này có sẵn trong thời gian biên dịch.

từ này trang. Kiểm tra nó, có một số cách để giải quyết lỗi. Tôi hy vọng nó sẽ giúp.


Cảm ơn bạn Alberto! Bài viết của bạn đã giúp tôi hiểu được vấn đề. Bây giờ tôi tò mò về cách Android đang xử lý classpath. Hiện đang đọc vấn đề này: stackoverflow.com/questions/1095322/…
kjoelbro

@Kjoendo Bạn được chào đón. Tôi sẽ đọc liên kết về vấn đề này. :)
Alberto Solano

Tôi vừa có cái này cho một ConcurrentSkipListMap; Tôi nghĩ đó là vì ứng dụng của tôi được chạy trên thiết bị Froyo, và lớp học đó vắng mặt trong Froyo; tuy nhiên, AdMob yêu cầu tôi nhắm mục tiêu Ice Cream Sandwich nên tôi đã không nhận thấy điều này!
Andrew Wyld

4

Trong trường hợp của tôi, tôi đang cố gắng thêm một lớp java bình thường (từ một dự án java thông thường) được biên dịch với jre 1.7 vào một dự án ứng dụng android được biên dịch với jre 1.7.

Giải pháp là biên dịch lại lớp java bình thường đó với jre 1.6 và thêm các tham chiếu vào dự án ứng dụng android (cũng được biên dịch với jre 1.6) như bình thường (theo thứ tự tab và xuất, hãy nhớ kiểm tra lớp, dự án, v.v.).

Quá trình tương tự, khi sử dụng thư viện android để tham chiếu các lớp java bình thường bên ngoài.

Không biết có gì sai với jre 1.7, khi biên dịch các lớp java bình thường từ một dự án java bình thường và cố gắng tham chiếu chúng trong các dự án ứng dụng android hoặc thư viện android.

Nếu bạn không sử dụng các lớp java bình thường (từ một dự án java thông thường), bạn không cần phải hạ cấp xuống jre 1.6.


3

Đối với tôi, vấn đề này liên quan đến API mà tôi đang sử dụng không được triển khai. Ví dụ, tôi đã sử dụng ZSDK_API.jarmột tham chiếu.

Để khắc phục sự cố, tôi phải nhấp chuột phải vào dự án và chọn thuộc tính. Từ JAVA BUILD PATH, tôi phải thêm API chưa được triển khai. Điều này thật kỳ lạ vì ứng dụng không tìm thấy lớp MainActivity và trên thực tế, lỗi là do lớp DiscoveryHandler không được tìm thấy.

Hy vọng điều này sẽ giúp ai đó.


2

Tôi đã gặp NoClassDefFoundError cho một lớp tồn tại trong dự án của tôi (không phải lớp thư viện). Lớp tồn tại nhưng tôi nhận được NoClassDefFoundError. Trong trường hợp của tôi, vấn đề là hỗ trợ multidex. Vấn đề và giải pháp là ở đây: Android Multidex và các thư viện hỗ trợ

Bạn gặp lỗi này đối với các phiên bản Android thấp hơn 5.0.


2

Trên Android Studio:

1) Thêm multiDexEnabled = truevào Cấu hình mặc định của bạn

2) Thêm biên dịch com.android.support:multidex:1.0.0 trong phần phụ thuộc của bạn

3) Application class mở rộng MultiDexApplicationthay vì chỉApplication


1

Ý kiến ​​khác. Ví dụ: bạn có lớp bắt nguồn từ "android.support.v4.app.Fragment".

Tuy nhiên, bạn đã mắc lỗi và kế thừa nó từ "android.app.Fragment". Sau đó, bạn sẽ gặp lỗi này trên các thiết bị Android 2.


1

Tôi vừa tìm ra một cái gì đó với lỗi này.

Chỉ cần đảm bảo rằng tệp jar thư viện có chứa lớp R đã biên dịch trong gói android.support.v7.appcompat và sao chép tất cả res trong "dự án" hỗ trợ appcompat v7 trong thư mục ANDROID_SDK_HOME / extras / android / support / v7 / appcompat của bạn.

Tôi sử dụng Netbeans với plugin Android và điều này đã giải quyết được sự cố của tôi.


1

Tôi đoán rằng bạn không chỉ định javacmục tiêu của khi tạo thư viện chung, vì vậyjavac tự động sử dụng mục tiêu mới nhất có sẵn, có thể là 1.7 (Java7) hoặc 1.8 (Java8).

Nó đã được tuyên bố rằng

Android yêu cầu mức tuân thủ trình biên dịch 5.0 hoặc 6.0

dx của các công cụ xây dựng của Android <19.0.0 không thể chuyển đổi mã bytecode của Java7 (hoặc cao hơn) thành mã bytecode Dalvik.

Vì vậy, hãy sử dụng phiên bản công cụ xây dựng> = 19.0.0 hoặc sử dụng javacvới -target 6 , bằng cách sửa đổi ví dụ như con kiến ​​của bạn build.xmlnhư sau:

<javac
srcdir="src/"
destdir="build/"
target="6"
/>

0

Tôi đã khắc phục sự cố này bằng cách thêm đường dẫn dự án thư viện trong project.propertied theo cách thủ công. một số cách nhật thực đã không tự động thêm mục nhập này cùng với "thêm dự án". vì vậy điểm mà ứng dụng đang cố gắng tham chiếu bất kỳ thành phần nào bên trong dự án lib, nó đã bị lỗi.

bạn cũng có thể thử điều tương tự. ứng dụng phụ thuộc trong projec.properties như

android.library.reference.1 = .... \ android-sdks \ extras \ google \ google_play_services \ libproject / google-play-services_lib

và chạy .


0

các lọ từng nằm trong thư mục lib /, giờ chúng ở trong libs / Nếu bạn sử dụng lib, bạn có thể di chuyển các lọ của mình từ lib sang libs và xóa các phụ thuộc khỏi thuộc tính dự án / đường dẫn xây dựng java vì Android sẽ tự động tìm thấy chúng .


0

Đối với tôi, vấn đề là thư viện tham chiếu được xây dựng bằng java 7. Tôi đã giải quyết vấn đề này bằng cách xây dựng lại bằng cách sử dụng 1.6 JDK.


0

Một số lần java.lang.NoClassDefFoundError: lỗi xuất hiện khi sử dụng ART thay vì thời gian chạy Dalvik. Để thay đổi thời gian chạy, chỉ cần vào Tùy chọn nhà phát triển -> Chọn Thời gian chạy -> Dalvik.


0

Nếu không có cách nào ở trên hoạt động (giống như nó đã xảy ra với tôi) và bạn đang sử dụng làm thư viện thì một dự án khác trong Eclipse.

Làm như vậy: Nhấp chuột phải vào dự án -> Thuộc tính -> Android -> Thư viện -> Thêm

Điều đó đã làm nó cho tôi! Thêm dự án làm thư viện (Thuộc tính dự án)


0

Hoạt động lại được thêm vào tệp kê khai. Tôi đã thử trong tệp kê khai của mình thì ứng dụng hoạt động.

 <activity
        android:name="com.xxx.xxx.MainActivity"

0

Hãy thử đi đến

  • Nhấp chuột phải vào dự án
  • Đường dẫn xây dựng Java
  • Nguồn
  • bên phải -> Thêm nút thư mục
  • thư mục libs đã chọn và OK

Tôi hy vọng nó sẽ giúp.


0

Các giải pháp:

  1. Liệt kê mục
  2. Kiểm tra đơn hàng xuất khẩu
  3. Bật Multi Dex
  4. Kiểm tra mức api của các chế độ xem trong bố cục. Tôi gặp phải vấn đề tương tự với searchView. Tôi đã kiểm tra mức api trong khi thêm searchview nhưng đã thêm triển khai SearchView.OnQueryTextListener vào tệp lớp.

-4

1) Trong tệp kê khai, hãy đề cập đến tên hoạt động và hành động của bạn đối với nó và cả danh mục. 2) Trong Hoạt động của bạn, hãy đề cập đến chế độ xem nội dung bắt đầu của bạn và đề cập đến id chế độ xem của bạn trong hoạt động.


Ai đó đã gắn cờ nhầm đây không phải là câu trả lời. Đây là một nỗ lực tìm kiếm một câu trả lời và do đó đủ điều kiện để trở thành một câu trả lời. Nếu bạn không thích câu trả lời, hành động thích hợp là bỏ phiếu cho câu trả lời đó (như 5 người khác đã có), không gắn cờ câu trả lời đó. Xem câu trả lời của bạn ở trong lâu đài khác - Khi câu trả lời không phải là câu trả lời: meta.stackexchange.com/questions/225370/…
ArtOfWarfare
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.