NoClassDefFound-fout wanneer klasse zeker bestaat

Ik heb nu een paar maanden aan een game gewerkt en ben plotseling een probleem tegengekomen.

Sinds gisteren kreeg ik een foutmelding NoClassDefFound . Er zijn helemaal geen codewijzigingen geweest. Het werkte 's nachts en was niet' s ochtends. Geen enkele verandering. Hier is de exacte stacktrace:

06-23 23:12:19.746: E/ACRA(29146): Blue Boy fatal error : com.appaholics.blueboy.BlueBoy
06-23 23:12:19.746: E/ACRA(29146): java.lang.NoClassDefFoundError: com.appaholics.blueboy.BlueBoy
06-23 23:12:19.746: E/ACRA(29146):  at com.appaholics.blueboy.LoadingScreen.loadTextures(LoadingScreen.java:125)
06-23 23:12:19.746: E/ACRA(29146):  at com.appaholics.blueboy.LoadingScreen.load(LoadingScreen.java:85)
06-23 23:12:19.746: E/ACRA(29146):  at com.appaholics.blueboy.LoadingScreen.onCreate(LoadingScreen.java:40)
06-23 23:12:19.746: E/ACRA(29146):  at android.app.Activity.performCreate(Activity.java:4465)
06-23 23:12:19.746: E/ACRA(29146):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
06-23 23:12:19.746: E/ACRA(29146):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
06-23 23:12:19.746: E/ACRA(29146):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
06-23 23:12:19.746: E/ACRA(29146):  at android.app.ActivityThread.access$600(ActivityThread.java:123)
06-23 23:12:19.746: E/ACRA(29146):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
06-23 23:12:19.746: E/ACRA(29146):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-23 23:12:19.746: E/ACRA(29146):  at android.os.Looper.loop(Looper.java:137)
06-23 23:12:19.746: E/ACRA(29146):  at android.app.ActivityThread.main(ActivityThread.java:4424)
06-23 23:12:19.746: E/ACRA(29146):  at java.lang.reflect.Method.invokeNative(Native Method)
06-23 23:12:19.746: E/ACRA(29146):  at java.lang.reflect.Method.invoke(Method.java:511)
06-23 23:12:19.746: E/ACRA(29146):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-23 23:12:19.746: E/ACRA(29146):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-23 23:12:19.746: E/ACRA(29146):  at dalvik.system.NativeStart.main(Native Method)

De methode waarop de uitzondering voorkomt:

        private void loadTextures() {
        BlueBoy.sTextures = new HashMap();
        BlueBoy.sTiledTextures = new HashMap();
        BlueBoy.sTextureHolders = new ArrayList();
        BlueBoy.sHitVoiceSounds = new Sound[4];
        BlueBoy.sHitSounds = new Sound[4];
        BlueBoy.sWinSounds = new Sound[8];
        BlueBoy.sLoseSounds = new Sound[4];     
        Texture texture;
        TextureRegionFactory.setAssetBasePath("gfx/");
        BufferObjectManager.setActiveInstance(new BufferObjectManager());
        }

De klasse BlueBoy bestaat echter zeker. Om absoluut zeker te zijn, heb ik de classes.dex van mijn eigen app gedecompileerd. Ik heb zowel degene die werd gegenereerd tijdens het maken van de .apk en de in in de .apk zelf gedecompileerd. De klas is in beide aanwezig. Het is ook aanwezig in /bin/classes/nl/appaholics/blueboy/. Wanneer het wordt gedecompileerd, kan ik de volledige bron van de klasse zien, zoals het zou moeten zijn.

Ik heb alles geprobeerd wat ik kon bedenken en op het net vinden om het te repareren. Ik heb:

  • Heeft een schone build erop uitgevoerd
  • Een nieuw project gemaakt van bron in eclipse
  • Een nieuw project gemaakt en alles handmatig naar hier toe verplaatst
  • Geprobeerd de naam van de klas te wijzigen
  • Geprobeerd de naam van het pakket te wijzigen
  • Geprobeerd om het te compileren vanaf de opdrachtregel
  • Geprobeerd om het van de opdrachtregel te verwijderen

Alle andere projecten in de werkruimte werken prima.

Andere klassen, zoals het opstartscherm en het laadscherm, worden gelanceerd voordat BlueBoy goed werkt. Android kan ze vinden.

Heeft iemand enig idee waarom dit zou gebeuren? De klasse bestaat net zo zeker als ik, maar Android is het daar niet mee eens.

EDIT: Zoals suggestie duffymo, controleer ik het klassenpad voor het bestaan ​​van deze klasse door het volgende toe te voegen aan mijn startscherm:

       try {
          Class.forName("com.appaholics.blueboy.BlueBoy", false, null);
       } catch (ClassNotFoundException e1) {
          Log.d("ClassCheck", "Not found.");
          e1.printStackTrace();
       }

Ik krijg het bericht Niet gevonden in de LogCat. Nu we weten dat de klas niet aanwezig is in het klassenpad, hoe repareer ik deze dan? De klasse zit in hetzelfde pakket als het opstartscherm en de laadklasse, en beide zijn aanwezig. Wat kan ervoor zorgen dat deze ene klas er niet is en hoe kan ik dit oplossen?

EDIT2: FWIW, System.getProperties ("java.class.path"); retourneert ". ".

1
Zorg ervoor dat de superklasse van BlueBoy bestaat.
toegevoegd de auteur CommonsWare, de bron
Doe je iets ongewoons (bijvoorbeeld gedoe met je eigen ClassLoader )? Heb je de single-parameter Class.forName() geprobeerd? Als u probeert een instantie van deze klasse te maken (normaal gesproken niet voor activiteiten, maar puur voor het diagnosticeren van wat er gebeurt), wat gebeurt er dan?
toegevoegd de auteur CommonsWare, de bron
@Mark. Het doet. Het breidt Activiteit uit, evenals de splash- en laadschermen.
toegevoegd de auteur Raghav Sood, de bron
Nee. Geen gedoe met ClassLoaders. Geef me een minuut om het uit te voeren met de enkele parameter.
toegevoegd de auteur Raghav Sood, de bron
Er verandert niets. Dezelfde LogCat, woord voor woord (volgens een diff-programma).
toegevoegd de auteur Raghav Sood, de bron
@Mark: Ik heb het opgelost. Zie mijn eigen antwoord op de vraag voor de details.
toegevoegd de auteur Raghav Sood, de bron

2 antwoord

Ik heb het kunnen repareren. Dit zijn de exacte stappen die ik heb gezet:

  • Dupliceer handmatig alle inhoud in een nieuw project. Gebruik de optie NIET om een ​​project van een bestaande bron te maken.
  • Ga naar de projecteigenschappen en verwijder de android.jar van het buildpad.
  • Opslaan
  • Voeg de pot handmatig toe en zorg ervoor dat deze voor dezelfde versie van Android is als daarvoor.

Het zou nu moeten werken. Ik heb de bovenstaande stappen op zowel het oorspronkelijke project als een project uit de bron geprobeerd en deze hebben niet gewerkt.

Ik weet niet hoe of waarom het werkt, maar ik weet dat het werkt. FWIW, ik gebruik ADT 18, met SDK-tools 19 en platformhulpmiddelen 11.

1
toegevoegd
Ik had hetzelfde probleem als Raghav, maar deze oplossing werkt niet voor mij. Het kopiëren van het project en het verwijderen/toevoegen van de Android-pot maakt geen verschil. Ik gebruik ADT 18 ook, en één klasse in hetzelfde bibliotheekpakket is beschikbaar terwijl de andere niet is, en beide zijn zichtbaar wanneer ik een dexdump doe.
toegevoegd de auteur Katlu, de bron
Ja, het is in "libs". Overigens loste ik het probleem op - de klasse die niet beschikbaar was, gebruikte een andere externe bibliotheek waarnaar nog steeds niet werd verwezen vanuit libs /.
toegevoegd de auteur Katlu, de bron
Is uw pot in/libs (met een "s")?
toegevoegd de auteur Raghav Sood, de bron

Mijn probleem was dat een methode in de klas een methodeaanroep gebruikte die hoger was dan het minimale API-niveau dat is ingesteld in het android-manifest. Door de klasse compatibel te maken met het minimale API-niveau, is het probleem verholpen. Dit probleem kan worden gedetecteerd door Android Lint-controle uit te voeren, die u precies vertelt welke methode aanroep het probleem veroorzaakt

0
toegevoegd