Intereting Posts
Android SDK Manager не будет обновлен: подключение к https://dl-ssl.google.com отклонено Как настроить представление Android на основе размеров родителя Android – как получить трансляцию намерений ACTION_SCREEN_ON / OFF? Очистить все действия в задаче? Android: Как я могу использовать элементы списка слоев и фигуры для рисования горизонтального правила при установке в качестве фона? Выбор намерений для Android Универсальный загрузчик изображений не может загружать изображения иногда Кнопка радио с изображением в качестве опции вместо текста Что такое код цвета для Android Hint? StaggeredGridLayoutManager динамически изменяет spanCount RecylerView ScrollView не показывает верхнюю часть Как передать параметры OnClickListener? JQuery Mobile не работает с дополнительным javascript Настройки оптимизации Proguard: включение слияния классов, трансляции и поля / * в современных API и версиях Proguard Не удалось получить доступ к jarfile lib \ archquery.jar

Активность Android в Eclipse / ADT с зависимостями проекта (сбой разрешения XY)

Я старался, чтобы игровой проект был совершенно независимым от платформы, поэтому я разложил его на три проекта с низкого уровня до верхнего уровня Android, такого как: движок, игра и Android.

Введенные классы / интерфейсы в ошибке:

  1. (Низкоуровневый) проект определяет этот интерфейс:

    com.myteam.engine.IGame 
  2. (Средний уровень) платформенный независимый игровой проект определяет эти классы:

     com.myteam.myproject.Game com.myteam.myproject.MyProject (derived from com.myteam.myproject.Game) 
  3. (Верхний уровень) проекта андроида реализует деятельность и т. Д .:

     com.myteam.myproject.android.MyAndroidActivity (using com.myteam.myproject.MyProject) 

Все компилируется хорошо и отлично работает под Windows (с другим проектом Windows на третьем уровне с использованием первых двух).

Но при работе с ADT он не работает во время выполнения, когда начинается Activity. Приложение Android в основном просто отображает стек вызовов с исключением «NoClassDefFoundError com.myteam.myproject.MyProject».

Исключение похоже на его суперкласс (или интерфейс супер класса) при загрузке / разрешении, поскольку вывод LogCat показывает:

 12-20 19:51:51.897: D/ddm-heap(218): Got feature list request 12-20 19:51:52.207: I/dalvikvm(218): Failed resolving Lcom/myteam/myproject/Game; interface 18 'Lcom/myteam/engine/IGame;' 12-20 19:51:52.217: W/dalvikvm(218): Link of class 'Lcom/myteam/myproject/Game;' failed 12-20 19:51:52.227: W/dalvikvm(218): Unable to resolve superclass of Lcom/myteam/myproject/MyProject; (52) 12-20 19:51:52.227: W/dalvikvm(218): Link of class 'Lcom/myteam/myproject/MyProject;' failed 12-20 19:51:52.227: E/dalvikvm(218): Could not find class 'com.myteam.myproject.MyProject', referenced from method com.myteam.myproject.android.MyAndroidActivity.onCreate 12-20 19:51:52.227: W/dalvikvm(218): VFY: unable to resolve new-instance 54 (Lcom/myteam/myproject/MyProject;) in Lcom/myteam/myproject/android/Youcode_AndroidActivity; 12-20 19:51:52.227: D/dalvikvm(218): VFY: replacing opcode 0x22 at 0x0008 12-20 19:51:52.227: D/dalvikvm(218): Making a copy of Lcom/myteam/myproject/android/Youcode_AndroidActivity;.onCreate code (88 bytes) 

Я попытался добавить два первых проекта в соответствии с настройками проекта «Создание пути / порядок и экспорт» Eclipse проекта Android, как описано в других сообщениях и форумах, но это ничего не меняет.

Моя догадка заключается в том, что для параметров манифеста или проекта необходимо другое упоминание о зависимости пакета / класса для упаковки apk или времени выполнения. Есть идеи?

Solutions Collecting From Web of "Активность Android в Eclipse / ADT с зависимостями проекта (сбой разрешения XY)"

У меня есть трехуровневое приложение для Android / Java, почти так же, как и вы:

  1. Проект только для Java для низкоуровневой сетевой связи
  2. Проект только для Java для абстрагирования функций проекта низкого уровня
  3. Android-приложение

Каждая вещь выше – отдельный проект Eclipse, содержащийся в одном рабочем пространстве.

Вот что вам нужно сделать:

  1. В свойствах проекта App-> Java Build Path-> Projects добавьте только Java-проекты
  2. В свойствах проекта App -> Java Build Path-> Order and Export, проверьте проекты только для Java (которые маркируют их для экспорта)

Теперь ваше приложение должно создавать и запускать без исключений VFY или ошибок VFY например:

 03-27 21:10:17.120: W/dalvikvm(420): VFY: unable to find class referenced in signature (Labstractionlayer/BaseStationManager;) 03-27 21:10:17.120: W/dalvikvm(420): VFY: unable to find class referenced in signature (Labstractionlayer/BaseStationManager;) 03-27 21:10:17.160: I/dalvikvm(420): Failed resolving Lcom/demo/log/AndroidLogWrapper; interface 253 'Lcommon/Logger/LogWrapper;' 03-27 21:10:17.160: W/dalvikvm(420): Link of class 'Lcom/demo/log/AndroidLogWrapper;' failed 03-27 21:10:17.160: E/dalvikvm(420): Could not find class 'com.demo.log.AndroidLogWrapper', referenced from method com.demo.Application.onCreate 03-27 21:10:17.160: W/dalvikvm(420): VFY: unable to resolve new-instance 218 (Lcom/demo/log/AndroidLogWrapper;) in Lcom/demo/Application; 03-27 21:10:17.170: D/dalvikvm(420): VFY: replacing opcode 0x22 at 0x0003 03-27 21:10:17.170: D/dalvikvm(420): VFY: dead code 0x0005-003c in Lcom/demo/Application;.onCreate ()V 03-27 21:10:17.170: D/AndroidRuntime(420): Shutting down VM 03-27 21:10:17.170: W/dalvikvm(420): threadid=1: thread exiting with uncaught exception (group=0x40015560) 03-27 21:10:17.180: E/AndroidRuntime(420): FATAL EXCEPTION: main 03-27 21:10:17.180: E/AndroidRuntime(420): java.lang.NoClassDefFoundError: com.demo.log.AndroidLogWrapper 

BTW, перед ADT r17 вам нужно было сделать только шаг 1 выше (добавить проекты только для Java). Но начиная с r17, вам также нужно сделать шаг 2 (отметьте проекты только для Java для экспорта).

Добавьте название ваших зависимых проектов в файл .claspath вашего проекта Android. как это:

 <?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" path="src"/> <classpathentry kind="src" path="gen"/> <classpathentry combineaccessrules="false" kind="src" path="/DependentProject1"/> <classpathentry combineaccessrules="false" kind="src" path="/DependentProject2"/> <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/> <classpathentry kind="output" path="bin"/> </classpath> к <?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" path="src"/> <classpathentry kind="src" path="gen"/> <classpathentry combineaccessrules="false" kind="src" path="/DependentProject1"/> <classpathentry combineaccessrules="false" kind="src" path="/DependentProject2"/> <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/> <classpathentry kind="output" path="bin"/> </classpath> 

Я пытался найти простое решение для этого давно, насколько я могу судить, единственный способ заставить ADT экспортировать последний apk с зависимыми библиотечными классами явно добавить все ваши внешние lib.jar (созданные с вашего Другие проекты) в путь сборки вашего Android-проекта.

Текущая версия плагина Eclipse ADT имеет очень негибкий предопределенный жизненный цикл сборки (в частности, на этапе dexing), по-видимому, он не поддерживает группировку проектов, отличную от трех типов Android Project (классика, библиотека и тест). Другими словами, ADT не знает, как создать свой Android-проект с помощью обычного java-зависимого проекта в рамках пути сборки и автоматически добавить lib.jar, сгенерированный зависимым проектом, в путь сборки основного проекта (даже если вы добавите их в Order И Export), если вы явно не добавите в него внешний lib.jar. Предположим, вы добавили C: \ workspace \ game \ target \ game.jar и C: \ workspace \ engine \ target \ engine.jar в свой путь сборки проекта Android, команда для создания вашего файла dex должна выглядеть примерно так:

 java [-Xmx1024M, -jar, C:\android-sdk-r16\platform-tools\lib\dx.jar, --dex, --output=C:\workspace\android-game\target\classes.dex, C:\workspace\android-game\target\classes, C:\workspace\game\target\game.jar, C:\workspace\engine\target\engine.jar] 

Если вы планируете использовать некоторые внешние средства сборки для управления жизненным циклом проекта, я знаю, что Maven обеспечивает более гибкую конфигурацию в жизненном цикле разработки Android. Он поддерживает многомодульный проект (группирование проектов) и может корректно обрабатывать регулярную зависимость проекта Java.

Мои знания основаны на Eclipse, с нетерпением жду услышать некоторые шумы от Android-источника или другого сложного пользователя IDE.

Обновление от ADT 17.0.0:

Последний выпуск SDK r17 с ADT 17.0.0 утверждает, что он корректно обрабатывает эти варианты использования:

Специальные изменения Eclipse

Контейнер динамических классов классов, называемый «Библиотечные проекты», был переименован в «Android Dependencies», поскольку теперь он содержит больше, чем только проекты библиотеки.

Теперь контейнер также будет заполнен проектами Java-only, на которые ссылаются проекты библиотеки. Если эти Java-проекты также ссылаются на другие Java-проекты и / или файлы jar, они будут добавляться автоматически (также поддерживаются файлы jar, на которые ссылаются пользовательские библиотеки).

Важно: это происходит только в том случае, если ссылки заданы для экспорта в проект ссылки. Обратите внимание, что это не значение по умолчанию при добавлении проекта или файла jar в путь сборки проекта. Библиотечные проекты (и содержимое их файлов libs / *. Jar) всегда экспортируются. Это изменение влияет только на проекты только для Java и их собственные файлы jar.

Опять же, дубликаты (оба проекта и файлы jar) обнаруживаются и удаляются.

Проверьте журнал изменений .

Я нашел эту ветку, и это действительно сработало для меня, просто убедитесь, что вы проверяете зависимый проект

Тестирование проекта Android с использованием jar dependecies

Полагаю, что путь Java Build для проекта среднего уровня включает проект низкого уровня. Вы проверили там проект низкого уровня (вкладка «Заказ и экспорт»)? В противном случае низкоуровневая зависимость проекта не перенаправляется на проект высокого уровня, исключая IGame из APK, который фактически вызывает сбой.

Однако это решение AFAIK не будет работать, если ваши проекты содержат специфические для Android вещи, такие как ресурсы и т. П.

Я сомневаюсь в вас и вашем проекте. С моей точки зрения, я вижу, что у вас хороший дизайн. Но почему вы работаете с « Build Path / Order and Export ? Честно говоря, я никогда не ходил на эту вкладку с первого дня работы с Eclipse.

Чтобы импортировать файлы jar в виде библиотек, используйте вкладку « Libraries -> добавить внешние банки.

И мне жаль, что я не знаю об игровом программировании, это всего лишь предложение: убедитесь, что ваш движок подходит для Android. Например, Android не поддерживает javax.imageio . Если нет, приложение может быть скомпилировано с помощью внешних банок, но может быть разбито во время выполнения.

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

Я получил эту ошибку от использования оператора switch / case на R.id. «константа». Последние обновления больше не считают объявления R.java постоянными в коде, даже если они объявлены окончательными. Что произойдет, так как .apk скомпилирует и установит, но даст эти ошибки Lcom.

Чтобы решить эту проблему (в Eclipse), поместите курсор в объявлении коммутатора и используйте Ctrl + 1, чтобы преобразовать переключатель в список if then else . Обратите внимание, если у вас есть вложенные разрывы внутри оператора case, вам нужно будет переписать этот блок кода (возможно, с дополнительными файлами ).