[英]NoClassDefFound error when class definitely exists
我已經從事游戲工作幾個月了,突然遇到了問題。
從昨天開始,我一直在收到NoClassDefFound
錯誤。 根本沒有代碼更改。 它在晚上工作,而不是在早晨。 完全沒有變化。 這是確切的堆棧跟蹤:
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)
發生異常的方法:
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());
}
但是,BlueBoy類肯定存在。 為了絕對確定,我已經開始反編譯自己的應用程序的classes.dex
。 我已經反編譯了在創建.apk時生成的代碼以及在.apk本身中生成的代碼。 這兩個中都存在該類。 它也存在於/bin/classes/com/appaholics/blueboy/
。 反編譯后,我可以看到該類的完整源代碼。
我已經嘗試了所有可以想到的方法,並在網上找到了解決方法。 我有:
工作區中的所有其他項目都可以正常工作。
在BlueBoy正常工作之前啟動的其他類(如啟動屏幕和加載屏幕)。 Android可以找到它們。
有誰知道為什么會這樣嗎? 該類的確和我一樣存在,但是Android不同意。
編輯:根據duffymo的建議,我通過將以下內容添加到我的初始屏幕中,檢查類路徑是否存在:
try {
Class.forName("com.appaholics.blueboy.BlueBoy", false, null);
} catch (ClassNotFoundException e1) {
Log.d("ClassCheck", "Not found.");
e1.printStackTrace();
}
我在LogCat中收到“ Not Found
消息。 現在我們知道該類不在類路徑中,我該如何解決? 該類與初始屏幕和加載類在同一程序包中,並且兩者都存在。 是什么導致該課程不存在,我該如何解決?
EDIT2:FWIW, System.getProperties("java.class.path");
返回“ .
”。
我已經設法解決了。 這些是我采取的確切步驟:
現在應該可以工作了。 我在原始項目和我從其源代碼創建的項目中都嘗試了上述步驟,但是它們沒有用。
我不知道它如何或為什么起作用,但我知道它起作用。 FWIW,我正在使用ADT 18,SDK工具19和平台工具11。
我的問題是該類中的方法使用的方法調用高於android清單中設置的最低API級別。 使類與最低API級別兼容可以解決此問題。 可以通過運行Android Lint檢查來檢測到此問題,該檢查將准確告訴您導致問題的方法調用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.