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 ".
".