NoClassDefFoundError на андроиде - очень странная ситуация? - PullRequest
2 голосов
/ 07 ноября 2011

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

Я проверил, что класс действительно существует через этот фрагмент кода:

try{
  Field dexField = PathClassLoader.class.getDeclaredField("mDexs");
  dexField.setAccessible(true);

  PathClassLoader classLoader =
   (PathClassLoader)Thread.currentThread().getContextClassLoader();
  Log.d("OUT", "Class loader" + classLoader.getClass().getName());

  DexFile[] dexs = (DexFile[]) dexField.get(classLoader);

  Log.d("OUT", "Enumerating");
  for (DexFile dex : dexs) {
    Enumeration<String> entries = dex.entries();
    while (entries.hasMoreElements()) {
     // (3) Each entry is a class name, like "foo.bar.MyClass"
     String entry = entries.nextElement();
     Log.d("OUT", "Entry: " + entry);
    }
  }
 }catch(Throwable e){
   Log.e("OUT", e.getMessage(), e);
 }
 // Here I reference to the problematic class

При запуске приложения на устройстве журнал выводит имя класса и выдает ошибку NoClassDefFoundError при обращении к нему.

Я здесь потерян.

Любой совет? Я был бы очень благодарен. Благодаря.

1 Ответ

4 голосов
/ 07 ноября 2011

Вы должны понимать, что, по крайней мере в канонической Java, «NoClassDefFoundError» не означает, что именованный файл .class не может быть найден в пути к классам.Скорее после того, как это было найдено, некоторая проблема препятствовала загрузке класса.

Двумя распространенными причинами этого являются проблема именования (класс находится в неправильном месте в структуре classpath, относительно его внутреннего объявленного имени пакета или просто неправильно назван), или проблема загрузки какого-то другого класса, который необходим длявыполнить проверку названного класса.Иногда проблема возникает из-за исключения в статическом инициализаторе класса.

...