簡體   English   中英

當類確實存在時,出現NoClassDefFound錯誤

[英]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/ 反編譯后,我可以看到該類的完整源代碼。

我已經嘗試了所有可以想到的方法,並在網上找到了解決方法。 我有:

  • 做一個干凈的構建
  • 在Eclipse中從源代碼創建一個新項目
  • 創建一個新項目並手動將所有內容移至該項目
  • 嘗試重命名課程
  • 嘗試重命名軟件包
  • 嘗試從命令行進行編譯
  • 嘗試從命令行清理它

工作區中的所有其他項目都可以正常工作。

在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"); 返回“ . ”。

我已經設法解決了。 這些是我采取的確切步驟:

  • 手動將所有內容復制到新項目中。 不要使用該選項從現有來源創建項目。
  • 轉到項目屬性,然后從構建路徑中刪除android.jar。
  • 手動重新添加jar,並確保它與以前的Android版本相同。

現在應該可以工作了。 我在原始項目和我從其源代碼創建的項目中都嘗試了上述步驟,但是它們沒有用。

我不知道它如何或為什么起作用,但我知道它起作用。 FWIW,我正在使用ADT 18,SDK工具19和平台工具11。

我的問題是該類中的方法使用的方法調用高於android清單中設置的最低API級別。 使類與最低API級別兼容可以解決此問題。 可以通過運行Android Lint檢查來檢測到此問題,該檢查將准確告訴您導致問題的方法調用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM