Pertanyaan NoClassDefFoundError untuk kode di pustaka Java di Android


Saya mengalami kesalahan cukup sering di antara pengguna saya. Aplikasi mogok saat startup. Ketika MainActivity seharusnya dimuat, VM tampaknya tidak dapat menemukan kelasnya. Saya tidak tahu mengapa. Arsitektur aplikasi adalah bahwa ada proyek umum yang digunakan baik versi gratis dan pro saya. Tidak tahu apakah itu relevan. Lihat jejak stack di bawah ini. Ada pikiran apa?

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]

Edit: Terima kasih atas komentar di bawah ini, Richard. Sekarang saya telah berubah com.android.Splash untuk sesuatu yang lain. Itu bukan nama kelas yang sebenarnya. Salahku...!


75
2017-12-30 10:47


asal


Jawaban:


Saya memiliki masalah yang sama, saya melakukan hal berikut untuk memperbaiki masalah.

  1. Pergi ke "Properties" dari proyek.
  2. Pilih "Java Build Path"
  3. Pilih "Pesan dan Ekspor" Tab
  4. Anda harus melihat jalur dan dependensi "src" dan "gen" proyek yang dipilih di sini.
  5. Urutan bagaimana mereka terdaftar adalah pertama "src" dan kemudian "gen" path
  6. Saya ganti mereka, sehingga folder "gen" dibangun sebelum "src"

gen - kode otomatis dalam proyek (dari dependensi dan referensi)
src - kode sumber dalam proyek

Tidak perlu me-restart Eclipse. Itu baru mulai bekerja.

Jujur saya belum pernah mencoba "Alat Android> Perbaiki Properti Proyek", kadang-kadang mungkin melakukan hal yang sama. Saya tidak tahu, saya baru saja melakukan di atas setelah melihat pesan kesalahan, berpikir ada yang salah dengan membangun jalur.


Edit


Kemudian itu tidak cukup, saya mendapatkan kesalahan lagi. Lalu saya "memeriksa" semua dependensi yang tercantum dalam tampilan itu. Sekarang berfungsi lagi. Sejauh ini bagus. Saya akan terus memperbarui ini jika gagal lagi.

FYI: dalam usaha terakhir saya, saya mencoba "Alat Android> Perbaiki Properti Proyek", tetapi tidak berhasil untuk saya.


126
2017-10-03 05:19



Saat ini saya menggunakan SDK 20.0.3 dan tidak ada solusi sebelumnya yang berhasil untuk saya.

Saya bisa mendapatkan sesuatu untuk dikerjakan

  • Klik kanan proyek Android
  • Kemudian pilih Build Path -> Link Source untuk memunculkan dialog Link Source.
  • Kemudian saya menentukan folder 'src' dari proyek Java dan memberinya nama selain dari default 'src' (misalnya 'src2').
  • Anda sekarang dapat mengklik kanan -> hapus folder 'src2' yang baru.

Ini membawa file kelas Java yang dibuat ini yang dikompilasi untuk Dalvik VM, bukan Java VM ketika proyek Android dibangun. Ini memungkinkan file kelas Java di file jar Gula Perpustakaan Android mengalami dexing ketika proyek Android .apk dibuat. Sekarang ketika aplikasi dijalankan kelas proyek Java ditemukan bukannya Java.lang.NoClassDefFoundError yang dilemparkan.

Jika Anda ingin menggunakan file jar alih-alih menghubungkan sumber, maka Anda perlu membuat proyek Android Library. (Sebuah Proyek Android dengan 'adalah perpustakaan' dicentang di Properti -> Android.) Kemudian Anda harus menghubungkan sumber Proyek Java ke proyek Perpustakaan Android seperti yang dijelaskan di atas atau menyalin file sumber dari folder 'src' dari Proyek Java ke folder 'src' dari proyek Perpustakaan Android. Bangun proyek Perpustakaan Android. Kemudian Anda akan dapat menyalin file jar Proyek Android yang dibuat ke folder 'libs' dari folder Android karena file kelas di dalamnya dikompilasi untuk VM Davlik alih-alih Java VM ketika proyek Android dibangun. Hal ini memungkinkan file kelas Java di file jar Gula Perpustakaan Android mengalami dexing ketika proyek Android .apk dibuat. Sekarang ketika aplikasi dijalankan kelas proyek Java akan ditemukan, bukan Java.lang.NoClassDefFoundError yang dilemparkan.


18
2018-06-21 06:13



Cobalah pergi ke Project -> Properties -> Java Build Path -> Order & Export dan pastikan Android Private Libraries diperiksa untuk proyek Anda dan untuk semua proyek perpustakaan lain yang Anda gunakan. saya mendapat solusi dengan mengikuti tautan di bawah ini Proyek Android NoClassDefFoundError?


17
2018-03-28 10:13



Kalau-kalau itu membantu seseorang, saya menghadapi masalah yang sama. File jar saya berada di bawah direktori libs dan toples ditambahkan ke jalur build. Masih membuang pengecualian itu.

Saya baru saja membersihkan proyek dan itu berhasil bagi saya.

Eclipse -> Project -> Clean -> Pilih proyek dan bersihkan


8
2017-07-04 05:46



Saya mencoba semua solusi yang disebutkan di atas tetapi tidak berhasil untuk saya, Inilah yang saya lakukan untuk menyelesaikannya project-> config build path-> order dan export-> pindah proyek tergantung di atas


7
2017-08-13 23:50



Kesalahan ini juga dihasilkan ketika Anda membuat aplikasi yang menggunakan Google API (seperti Maps) tetapi menjalankannya di perangkat yang menargetkan Android API.


6
2018-04-21 10:20



Saya menemukan NoClassDefFoundError ini ketika saya menggunakan java.nio.charset.StandardCharsets.

Alasannya adalah StandardCharsets belum ada hingga JRE 1.7. Jika saya membuat versi java compile diatur ke 1.7, Eclipse mengeluh bahwa "Android memerlukan compiler compliance level 5.0 atau 6.0". Jadi, saya memperbaikinya dengan mengklik kanan nama proyek-> Perangkat Android-> Perbaiki Properti Proyek. Ini dikompilasi dengan JRE1.6.

Namun, karena StandardCharsets belum ada hingga 1.7. Ini melaporkan NoClassDefFoundError ketika saya menjalankannya.

Saya belum menyadari ini sampai setelah mencoba banyak metode lain termasuk menginstal ulang JDK. Alasan sebenarnya adalah jelas diceritakan oleh arti NoClassDefFoundError: Kelas tidak dapat ditemukan pada waktu berjalan meskipun melewati kompilasi.

Kesimpulan umum adalah bahwa selama Android tidak bekerja dengan JRE 1.7, jika Anda menggunakan fitur baru yang disediakan sejak 1.7, Anda akan mengalami kesalahan ini.

Solusi saya adalah saya menyalin kode sumber itu ke dalam kode saya!


5
2017-12-30 10:54



Deskripsi NoClassDefFoundError adalah, dari tag SO:

Kesalahan Java dilemparkan jika Java Virtual Machine atau ClassLoader   instance mencoba memuat definisi kelas (sebagai bagian dari a   panggilan metode normal atau sebagai bagian dari pembuatan instance baru menggunakan yang baru   ekspresi) dan tidak ada definisi kelas yang dapat ditemukan. Itu   dicari-untuk definisi kelas ada ketika saat ini mengeksekusi   kelas dikompilasi, tetapi definisi tidak lagi dapat ditemukan.

Atau lebih baik:

NoClassDefFoundError di Java muncul ketika Java Virtual Machine tidak   dapat menemukan kelas tertentu pada waktu proses yang tersedia selama   waktu kompilasi.

dari ini halaman. Periksa, ada beberapa cara untuk menyelesaikan kesalahan. Saya harap itu membantu.


4
2017-11-27 15:24



Bagi saya masalah ini terkait dengan API yang saya gunakan tidak digunakan. Misalnya, saya menggunakan a ZSDK_API.jar sebagai acuan.

Untuk memperbaiki masalah saya harus mengklik kanan pada proyek dan memilih properti. Dari JAVA BUILD PATH, saya harus menambahkan API yang tidak digunakan. Ini aneh karena aplikasi melempar kelas MainActivity tidak ditemukan dan dalam kenyataannya kesalahan itu disebabkan oleh kelas DiscoveryHandler tidak ditemukan.

Berharap ini membantu seseorang.


3
2017-10-26 13:19