问题
I've been working on a game for a few months now, and have suddenly encountered a problem.
Since yesterday, I have been getting a NoClassDefFound
error. There have been no code changes at all. It was working at night, and wasn't in the morning. No change at all. Here is the exact 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)
The method in which the exception occurs:
private void loadTextures() {
BlueBoy.sTextures = new HashMap<String,TextureRegion>();
BlueBoy.sTiledTextures = new HashMap<String,TiledTextureRegion>();
BlueBoy.sTextureHolders = new ArrayList<Texture>();
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());
}
However, the class BlueBoy definitely exists. To make absolutely sure, I have taken to decompiling my own app's classes.dex
. I have decompiled both the one generated while making the .apk and the on in the .apk itself. The class is present in both of them. It is also present in /bin/classes/com/appaholics/blueboy/
. When decompiled, I can see the full source of the class, as it should be.
I have tried everything I could think of and find on the net to fix it. I have:
- Done a Clean Build on it
- Created a new project from source in eclipse
- Created a new project and manually shifted everything to it
- Tried renaming the class
- Tried renaming the package
- Tried compiling it from the command line
- Tried cleaning it from the command line
All of the other projects in the workspace work fine.
Other classes like the splash screen and loading screen, which are launched before BlueBoy work fine. Android can find them.
Does anybody have any idea as to why this would happen? The class is exists as surely as I exist, but Android disagrees.
EDIT: As per duffymo's suggestion, I check the class path for the existence of this class by adding the following to my splash screen:
try {
Class.forName("com.appaholics.blueboy.BlueBoy", false, null);
} catch (ClassNotFoundException e1) {
Log.d("ClassCheck", "Not found.");
e1.printStackTrace();
}
I get the Not Found
message in the LogCat. Now that we know that the class isn't there in the classpath, how do I fix it? The class is in the same package as the splash screen and loading class, and both of those are present. What could cause this one class to not be there, and how could I fix it?
EDIT2: FWIW, System.getProperties("java.class.path");
returns ".
".
回答1:
I've managed to fix it. These are the exact steps I took:
- Duplicate all of the content into a new project manually. DO NOT use the option to create a project from an existing source.
- Go to the project properties, and remove the android.jar from the build path.
- Save
- Add the jar back manually, making sure that it is for the same version of Android as before.
It should work now. I tried the above steps on both the original project and one which I created from it's source, and they didn't work.
I don't know how or why it works, but I know it does. FWIW, I'm using ADT 18, with SDK tools 19 and platform tools 11.
回答2:
My problem was that a method in the class was using a method call higher than the minimum API level set in the android manifest. Making the class compatible with the minimum API level fixed the issue. This issue can be detected by running Android Lint check, which will tell you exactly which method call is causing the problem
来源:https://stackoverflow.com/questions/11171726/noclassdeffound-error-when-class-definitely-exists