Ошибка NoClassDefFound, когда класс определенно существует

1

Я работаю над игрой в течение нескольких месяцев и внезапно столкнулся с проблемой.

Со вчерашнего дня я получаю ошибку NoClassDefFound. Изменений кода вообще не было. Он работал ночью и не был утром. Никаких изменений вообще. Вот точная 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)

Метод, в котором происходит исключение:

        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 и on в самом.apk. Класс присутствует в обоих из них. Он также присутствует в /bin/classes/com/appaholics/blueboy/. При декомпиляции я могу видеть полный источник класса, как и должно быть.

Я пробовал все, что мог придумать, и найти в сети, чтобы исправить это. У меня есть:

  • Сделано на нем чистая сборка
  • Создал новый проект из источника в eclipse
  • Создал новый проект и вручную переложил все на него
  • Попробовал переименовать класс
  • Пробовал переименовать пакет
  • Пробовал компилировать его из командной строки
  • Пробовал очистить его из командной строки

Все остальные проекты в рабочей области работают нормально.

Другие классы, такие как экран заставки и экран загрузки, которые запускаются до того, как BlueBoy работают нормально. Android может их найти.

Кто-нибудь знает, почему это произойдет? Класс существует так же точно, как и я, но Android не согласен.

EDIT: в соответствии с предложением duffymo я проверяю путь класса для существования этого класса, добавляя к моему заставке следующее:

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

Я получаю сообщение Not Found в LogCat. Теперь, когда мы знаем, что класса нет в пути к классам, как его исправить? Класс находится в том же пакете, что и экран заставки и класс загрузки, и оба они присутствуют. Что может заставить этот класс не быть там, и как я могу его исправить?

EDIT2: FWIW, System.getProperties("java.class.path"); возвращает " . ".

  • 0
    Убедитесь, что суперкласс BlueBoy существует.
  • 0
    @Mark. Оно делает. Это расширяет активность, как и заставки и экраны загрузки.
Показать ещё 4 комментария
Теги:
noclassdeffounderror

2 ответа

1
Лучший ответ

Мне удалось это исправить. Это точные шаги, которые я предпринял:

  • Дублируйте все содержимое в новый проект вручную. НЕ используйте параметр для создания проекта из существующего источника.
  • Перейдите к свойствам проекта и удалите файл android.jar из пути сборки.
  • Сохранить
  • Добавьте банку вручную, убедившись, что она для той же версии Android, что и раньше.

Теперь он должен работать. Я попытался выполнить описанные выше действия как по исходному проекту, так и по тому, который я создал из него, и они не работали.

Я не знаю, как и почему это работает, но я знаю, что это так. FWIW, я использую ADT 18, с инструментами SDK 19 и инструментами платформы 11.

  • 0
    У меня была та же проблема, что и у Рагхава, но это решение не работает для меня. Копирование проекта и удаление / добавление обратно баночки Android не имеет значения. Я также использую ADT 18, и один класс в том же пакете библиотеки доступен, а другой нет, и оба видны, когда я делаю dexdump.
  • 0
    Ваша банка в / libs (с "s")?
Показать ещё 1 комментарий
0

Моя проблема заключалась в том, что метод в классе использовал вызов метода выше минимального уровня API, установленного в манифесте android. Устранение проблемы совместимости класса с минимальным уровнем API. Эту проблему можно обнаружить, выполнив проверку Android Lint, которая сообщит вам, какой именно вызов метода вызывает проблему

Ещё вопросы

Сообщество Overcoder
Наверх
Меню