Android Activity ClassNotFoundException - her şeyi denedi


83

Bir uygulamayı bir çerçeve kitaplığı ve bir uygulama olarak yeniden düzenledim, ancak şimdi uygulamayı öykünücüde denediğimde ve başlattığımda aşağıdaki hata yığını izini alıyorum:

06-02 18:22:35.529: E/AndroidRuntime(586): FATAL EXCEPTION: main
06-02 18:22:35.529: E/AndroidRuntime(586): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.matthewrathbone.eastersays/com.matthewrathbone.eastersays.EasterSimonSaysActivity}: java.lang.ClassNotFoundException: com.matthewrathbone.eastersays.EasterSimonSaysActivity in loader dalvik.system.PathClassLoader[/data/app/com.matthewrathbone.eastersays-1.apk]
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.os.Looper.loop(Looper.java:123)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread.main(ActivityThread.java:4627)
06-02 18:22:35.529: E/AndroidRuntime(586):  at java.lang.reflect.Method.invokeNative(Native Method)
06-02 18:22:35.529: E/AndroidRuntime(586):  at java.lang.reflect.Method.invoke(Method.java:521)
06-02 18:22:35.529: E/AndroidRuntime(586):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-02 18:22:35.529: E/AndroidRuntime(586):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-02 18:22:35.529: E/AndroidRuntime(586):  at dalvik.system.NativeStart.main(Native Method)
06-02 18:22:35.529: E/AndroidRuntime(586): Caused by: java.lang.ClassNotFoundException: com.matthewrathbone.eastersays.EasterSimonSaysActivity in loader dalvik.system.PathClassLoader[/data/app/com.matthewrathbone.eastersays-1.apk]
06-02 18:22:35.529: E/AndroidRuntime(586):  at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
06-02 18:22:35.529: E/AndroidRuntime(586):  at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
06-02 18:22:35.529: E/AndroidRuntime(586):  at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
06-02 18:22:35.529: E/AndroidRuntime(586):  ... 11 more

Genellikle bu, manifest dosyasının bir şekilde yanlış olduğu anlamına gelir, ancak aklıma gelen her şeyi iki kez kontrol ettim.

İşte aktivite sınıfım:

package com.matthewrathbone.eastersays;

import android.os.Bundle;

import com.rathboma.simonsays.Assets.Season;
import com.rathboma.simonsays.SeasonPicker;
import com.rathboma.simonsays.SimonSaysActivity;

    public class EasterSimonSaysActivity extends SimonSaysActivity {

      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
      }

      @Override
      protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
      }

      @Override
      public SeasonPicker getSeasonPicker() {
       return new SeasonPicker(){
        @Override
        public Season getSeason() {
          // TODO Auto-generated method stub
          return Season.EASTER;
        }
       };
      }
    }

Gördüğünüz gibi, bildirimde doğru bir şekilde listeleniyor:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.matthewrathbone.eastersays"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".EasterSimonSaysActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Bunu nasıl düzelteceğime dair hiçbir fikrim yok ve herhangi bir yardım için minnettar olurum. Bu özel davranışı görmeden SO ile ilgili birçok benzer soruyu taradım.

Daha fazla bilgi:

  • Oluşturulan APK'nin içini kontrol ettim ve sınıfın classes.dex dosyasında bir girişi var
  • Tutulmada projeyi temizlemeyi / inşa etmeyi denedim
  • Halihazırda APK'nın bir kopyası olmayan tamamen yeni bir cihaz görüntüsü kullanmayı denedim
  • Kütüphane projesini normal bir java'ya çevirdim, sonra bir android projesine geri döndüm, fark yok
  • Soyut SimonSaysActivity'yi manifestoya eklemek hiçbir fark yaratmaz.
  • Her bağımlılığı bir android kütüphane projesi yapmaya ve ihtiyaç duydukları android sürümünü senkronize etmeye çalıştım, yardımcı olmadı

Çözümü buldum (aşağıya bakın). Cevap / yorum gönderen herkese: Hepiniz harikasınız, sorunları çözmeme yardım ettiğiniz için teşekkürler!

Görünüşe göre bu, bir SDK araçları yükseltmesiyle tanıtıldı. Bu bağlantı için yorumlarda aşağıdaki @ Nick'e teşekkürler: http://iqadd.com/item/noclassdeffounderror-adt-fix


1
Faaliyetiniz Kütüphanede mi yoksa uygulamada mı?
Jeshurun

Uygulamada. Kütüphane projesindeki temel bir etkinliği genişletir.
Matthew Rathbone

Karınca mı yoksa ADT ile mi inşa edersiniz? Görünüşe göre dex dosyaları kütüphane sınıfları içermiyor.
Tomasz Gawel

Hata, Etkinlik konumunuzun com.matthewrathbone.eastersays.com.matthewrathbone.eastersays.EasterSimonSaysActivity olduğu anlamına gelir - açıkça doğru değil. Kütüphanede bulunmayan proje paketine bir paket düzeyi eklemeyi deneyin, örneğin ... eastersays.myapp.EasterSimonSaysActivity ve manifest'te paket olarak com.matthewrathbone.eastersays.myapp'i belirtin. Ancak manifestteki proje yolunu kütüphane çerçeve yolundan farklı tutmak için kütüphaneye 'uygulamam' seviyesini eklemeyin.
Gunnar Karlsson

Yanıtlar:


148

Kendi projemle oynamak için biraz zaman harcadım ve probleminizi tekrarlayabiliyorum ve ana projemi çalıştırmaya çalışırken tam olarak aynı istisna yığını izini elde edebiliyorum, bu yüzden sebebi bu olabilir:

Tıpkı düşündüğüm gibi, her şey Android ana projesinde Android kitaplık projenize nasıl başvurduğunuzla ilgili, basit bir Eclipse yapılandırma ayarları.

Yanlış Yol:
Ana projeye sağ tıklayın, seçin Properties -> Java Build Path -> Projects -> Add..., bu Android kitaplık projesini Android ana projesinin derleme yolunda bir bağımlılık projesi olarak ekleyin, bu çalışmaz. Android ile ilgili tüm gerekli kaynaklar ana projede tanımlandıysa, derleme zamanında herhangi bir hata almazsınız, ancak uygulamayı çalıştırdığınızda, soruda açıklanan istisnayı alırsınız.

Doğru Yol:
Ana projeye sağ tıklayın Properties -> Android, Kitaplık bölümünde seçin , Android kitaplık projenizi buraya ekleyin. Bir kütüphane projesine başvurma resmi geliştirme kılavuzuna göz atın . Bu, tüm sorununuzu çözmelidir. Ayrıca, Kütüphane Projesi - Geliştirme hususlarında belirtildiği gibi, gerçek Android kütüphane projesine göre ilgili yol referansı kullanmanız gerektiğini unutmayın .

Bu yardımcı olur umarım.


1
Sen benim arkadaşım bir dahisin. Bununla ilgili ilginç olan şey, her zaman bir kitaplığı 'yanlış yolla' dahil etmemdi ve işe yaradı. Bu yüzden iki kütüphaneye yeniden düzenleme yaptığımda, farklı yaptığım bir şey olduğunu düşündüm. Bana saatler ve saatler kazandırdın.
Matthew Rathbone

komik olan şey daha önce çalışıyordu, sanırım sdk araçlarımı yükseltmek davranışı değiştirdi. Çok açık değildi.
Matthew Rathbone

3
Evet, SDK Araçlarını> ADT 17 olarak güncellemek, mevcut ADT sürümünün kitaplıkları işleme biçimindeki bir değişiklik nedeniyle bu hatayı ortaya çıkarır. Kontrol edin: iqadd.com/item/noclassdeffounderror-adt-fix
Nick

2
ADT 22'ye güncelleme, benzer bir soruna neden oldu: stackoverflow.com/questions/16596969/…
Niels

7
Birisi lütfen nerede bulabileceğimi bana bildirir Propertiesmi? Onu hiçbir yerde bulamıyorum.
neşeyle

8

Verdiğiniz kodu test ettim ve iyi çalışıyor. "SimonSaysActivity'yi genişletir" seçeneğini basitçe "Etkinliği genişletir" olarak değiştirmeyi deneyin ve çalıştığını kendiniz görün.

Çalışmamasının nedeni ya SimonSaysActivity'nin Aktiviteyi genişletmemesi (ki bu hatayı yaptığınızı düşünmüyorum) ya da derleme yolunun sırası yanlış.

derleme yolunun sırasına gitmek için şu adrese gidin:

project->properties->Java build path->order and export .

temel siparişim: project src, project gen, android 4.0.3, android bağımlılıkları.

bu sorun genellikle kitaplıkları kullandığınızda ortaya çıkar.


Yani haklısın, Activity'i doğrudan uzatırsam işe yarıyor. Yapım siparişim sizinkiyle eşleşiyor, bu yüzden onu bu şekilde düzeltmenin bir yolunu bulamıyorum. Başka fikrin var mı?
Matthew Rathbone

bu gerçekten tuhaf. sdk & adt'yi güncellemeyi deneyin. ayrıca, uygulamanızın kullandığı birden fazla kitaplık projesi (veya jar dosyası veya her ikisi) olup olmadığını lütfen bana bildirin. eğer öyleyse, derleme yolunun sırasına göre biraz oynamaya çalışın (kitaplıkları daha önce koymaya çalışırdım). Ek olarak, başka bir sorum var: "Aktivite" adlı bir sınıf oluşturdunuz mu ve belki de onu android yerine genişlettiniz mi?
android geliştiricisi

2 kütüphane projesi vardır, ikincisi (motor) hem simonSays hem de android projesine bağlıdır. Motor projesini SimonSays'den ihraç ederek, yapım siparişinin her kombinasyonunu denedim. Sorunuzun cevabı: Hiçbir yerde aktivite denen bir sınıfım yok.
Matthew Rathbone

motor çekirdek. diğer projeler bunu kullanmalı, tersi değil. sadece bir android projesi olan proje (bir kütüphane projesi değil) tüm faaliyetlerin, hizmetlerin, vb. beyanını içeren manifestoya sahip olmalıdır ... android kütüphane projelerindeki manifest (şu anda) fazla amaç taşımamaktadır (daha fazla bilgi için buna bakın: stackoverflow.com/a/10445630/878126 )
android geliştiricisi

1
sahip olmalılar. sadece manifest dosyası çok kısa olabilir ve neredeyse hiçbir şey içermeyebilir. Ayrıca project.properties dosyasını (projelerin her birinde) hedef sdk'sinin 15 olduğunu kontrol edin, çünkü bu şu anda en son sürümdür. Dilerseniz bana PM atabilirsiniz, ben de projeleri düzeltirim.
android geliştiricisi

2

Bir uygulamayı bir çerçeve kitaplığı ve bir uygulama olarak yeniden düzenledim.

Burada ne söylemeye çalıştığınızdan tam olarak emin değilim, ama burada "yeniden düzenlenmiş" kelimesini kullanmanız, bir kütüphane projesi konseptini yanlış anladığınıza inanmamı sağlıyor.


Kütüphane projeleri nelerdir :

Bir kütüphane projesi, paylaşılan kaynak kodu ve kaynakları içeren bir geliştirme projesidir. Diğer Android projeleri kitaplık projesine başvurabilir ve derlenen kaynaklarını derleme zamanında .apk dosyalarına ekleyebilir.

Hangi kütüphane projeleri değildir :

Bir kitaplık projesi, onu doğrudan tek bir .apkdosyada derleyemeyeceğiniz ve bir Android cihazda çalıştıramayacağınız için standart bir Android projesinden farklıdır . Bir Android projesini kitaplık projesi olarak kullanıp ardından kitaplık projesini genişleten başka bir Android projesine sahip olamazsınız . O şekilde çalışmıyor.


Bununla birlikte, kütüphane projenizin yapısını araştırır ve doğru kurduğunuzdan emin olurum . Paylaşılan kodu / kaynakları depolamak için kitaplığınızı kullanmanızda bir sorun yoktur, ancak kitaplığınız .apkkitaplık projesinin içinde ayrı bir şeymiş gibi davranmaya çalışıyorsa , muhtemelen yanlış bir şey yapmışsınızdır. ClassNotFoundExceptionBu durumda bir atılacağına inanıyorum . Sorunu çözmek için, Android projesini bir kitaplık projesine dönüştürmeye çalışmak yerine kitaplık projesini sıfırdan oluşturdum. Bu, küçük, sinir bozucu böceklerle karşılaşmanızı önleyecektir.

Hala sorun yaşıyorsanız daha fazla kod göndermekten çekinmeyin. Ayrıca, kütüphane projenizin yapısı (ve amacı) hakkında biraz daha fazla ayrıntıya girmelisiniz ... neden birini kullanmaya karar verdiniz, nasıl oluşturduğunuz vb.


Evet, tek tek projelere kesinlikle doğru davranıyordum, aslında soruna neden olan kütüphane projelerine referans verme tarzımdı. Yine de harika yardım için teşekkürler!
Matthew Rathbone

np ... denemeye değerdi, haha
Alex Lockwood

2

Eclipse Kepler (Mac) için: Kontrol tuşuna basarak tıklayın -> Android Araçları -> destek kitaplığı ekleyin


Bu benim için düzeltti. bir kitaplık çalışmadığı için sadece v4-support.jar dahil.
whiteagle

2

Durumum farklı olsa da üzerinde çalıştığım bir projede bu sorunu yaşadım. Orada hala sorunlarına çözüm bulamayan biri varsa, şunu kontrol etmeyi deneyin:

Eclipse'de:

Project properties -> Java Build Path -> Source tab

İçinde, projenizi (ve / gen ) oluşturmak için her seferinde derlenecek ve oluşturulan apk'ye konulacak tüm kaynak klasörleri içeren bir liste bulacaksınız . Tipik olarak:

>MyProject/gen
>MyProject/src

Emin olmak isteyeceğiniz şey, kaynak klasörlerinizin her birinde ( bu durumda / gen hariç , yani yalnızca / src ) öğenin Output foldervarsayılan çıktı klasörüne, yani MyProject/bin/classes. Bunu, Çıktı klasörünü seçip sağ düğme kümesinden Kaldır'ı tıklatarak yapın (bu, klasörü varsayılan klasörü gösterecektir).

Alt öğe Çıktı klasörünü göremiyorsanız, listenin hemen altındaki "Kaynak klasörler için çıktı klasörlerine izin ver" seçeneğini işaretleyin.


1

Tüm ipuçlarını takip ettiyseniz (özel Kitaplıkları kontrol ettiyseniz vb.) Ve hala hataya sahipseniz. Uygulama etiketinde bu kod satırı için bildiriminizi kontrol edin

    android:hasCode="false" 

Çıkarın ve mutlu olun. (Ben sonunda) :)


Çok teşekkür ederim!! bu beni deli ediyor. Bu benim için çalıştı, sadece yükleyen bir kukla MainActivity vardı. Yorumunuzu bulmak 2 gün sürdü!
AdrianTut

1

Java'daki classNotFoundException, java.lang.Exception'ın bir alt sınıfıdır ve Java Virtual Machine belirli bir sınıfı yüklemeyi denediğinde ve istenen sınıfı sınıf yolunda bulamadığında gelir.

Daha fazlasını okuyun: http://javarevisited.blogspot.com/2011/08/classnotfoundexception-in-java-example.html#ixzz3yX3WBeFA

Projeniz ve Uygulamanızda kullandığınız diğer tüm kitaplık projeleri için Android Özel Kitaplıklarının kontrol edildiğini Project -> Properties -> Java Build Path -> Order & Exportve Onaylayın bölümüne gitmeyi deneyin .

ClassNotFoundException ile nasıl başa çıkılır

  1. Talep edilen sınıfın adının doğru ve emin olun uygun .jar dosyası var sınıf yolunda . Değilse, bunu açıkça uygulamanızın sınıf yoluna eklemeniz gerekir.
  2. Belirtilen .jar dosyasının sınıf yolunuzda bulunması durumunda, uygulamanızın sınıf yolu geçersiz kılınır ve uygulamanız tarafından kullanılan tam sınıf yolunu bulmanız gerekir.
  3. İstisnanın bir üçüncü taraf sınıfından kaynaklanması durumunda, istisnayı oluşturan sınıfı belirlemeniz ve ardından eksik .jar dosyalarını sınıf yolunuza eklemeniz gerekir .

1

Bu herkes için geçerli olmayacak olsa da, son zamanlarda bu sorunu yaşadım çünkü projem cihazda bulunan paylaşılan bir kitaplıkla bağlantı kuramıyordu. Beyannamemde başvurumu belirtmeyi unutmuşum <uses-library>.



0

SimonSaysActivity hangi arayüzleri veya ebeveyn sınıflarını kullanıyor / genişletiyor ve bunlar kullandığınız Android sürümünde mevcut mu? Etkinliğimin kullandığım Android sürümünde bulunmayan bir API arayüzünü uyguladığı benzer sorunlar gördüm.

Benim durumumda etkinliğim, yalnızca API 14'te bulunan PopupMenu.OnDismissListener arayüzünü uyguladı, ancak uygulamayı 2.3 cihazımda çalıştırdığımda, etkinlik için bir java.lang.NoClassDefFoundError istisnası aldım.


tüm sürümler aynıdır, android 2.2.
Matthew Rathbone

0

Aynı problemi yaşadım ve bir günün çoğunu her türlü şeyi deneyerek boşa harcadım. Uygulama, bir bilgisayardan kurulduğunda ancak bu bilgisayarda değilken bul'u çalıştırdı. Sonunda, eksik bir java doğası haline geldi! Bana java oluşturma yollarını, sipariş / dışa aktarım ve bunların hepsini ancak henüz bir java doğasına sahip olmadığını göstermesi garip. :( Umarım bu başka birine çok zaman kazandırır


0

@yorkw tarafından sağlanan çözüm kesinlikle doğrudur. Ek bir sorun yaşadım, düzen dosyalarından birinde mutlak adı yanlış belirtmiştim. Olmalıydı

<android.support.v4.view.ViewPager xmlns:android="...

daha doğrusu koymuştum

<android.support.v4.app.view.ViewPager xmlns:android="...

Bunları çözdükten sonra iyi çalıştı.


0

İster inanın ister inanmayın, benim için düzeltme, her şeyi en az 4 saat denedikten sonra projemden google analytics kitaplığının eski sürümünü (2.0) kaldırmaktı. Elbette bu kütüphanenin bir güncellemesi de çözüm olabilir. Bu nedenle, bağımlılık jar sürüm oluşturma sorunu olabilir.


0

Bu tür bir hatayı alıyordum ve her şeyi denedim ama çözümü alamadım. sonra aar dosyası olarak kitaplığı kullanıp kullanmadığınızı anladım, o zaman aar kitaplığınızın tüm bağımlılıklarını uygulamanızın gradle.build dosyasına eklemeniz gerekir. Birisi çözümü bulamadıysa, bunu deneyin!


-1

Ben de aynı sorunu alıyordum. Ancak daha sonra uygulamanın mevcut yapısını kontrol ettim. Eski uygulama yapısının (android çerçeve geliştiricileri tarafından ne zaman değiştirildiğini bilmiyorum) "lib"şimdi olan bir klasör adına sahip olduğunu buldum "libs". Tüm jar dosyalarımı "libs" e taşıdım ve hata gitti. Umarım bu birine yardımcı olabilir :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.