Я работаю над игрой в течение нескольких месяцев и внезапно столкнулся с проблемой.
Со вчерашнего дня я получаю ошибку 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/
. При декомпиляции я могу видеть полный источник класса, как и должно быть.
Я пробовал все, что мог придумать, и найти в сети, чтобы исправить это. У меня есть:
Все остальные проекты в рабочей области работают нормально.
Другие классы, такие как экран заставки и экран загрузки, которые запускаются до того, как 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");
возвращает " .
".
Мне удалось это исправить. Это точные шаги, которые я предпринял:
Теперь он должен работать. Я попытался выполнить описанные выше действия как по исходному проекту, так и по тому, который я создал из него, и они не работали.
Я не знаю, как и почему это работает, но я знаю, что это так. FWIW, я использую ADT 18, с инструментами SDK 19 и инструментами платформы 11.
Моя проблема заключалась в том, что метод в классе использовал вызов метода выше минимального уровня API, установленного в манифесте android. Устранение проблемы совместимости класса с минимальным уровнем API. Эту проблему можно обнаружить, выполнив проверку Android Lint, которая сообщит вам, какой именно вызов метода вызывает проблему
BlueBoy
существует.