Подтвердить что ты не робот

NoClassDefFoundError для проекта внешней библиотеки для Android

Я использую eclipse для разработки Google Android.

Я создал проект библиотеки ([x] Is Library в Android-настройках), который включает внешний jar файл (Referenced Libraries). Этот проект библиотеки упоминается в другом проекте (фактический проект, который будет использовать проект библиотеки). Это делается путем добавления проекта под Android-настройками.

исходный компилятор, но если я хочу его выполнить на устройстве, я получаю NoClassDefFoundError для класса внутри jar файла, который включен в проект библиотеки.

Изменить: JAR файл добавлен в экспортированные записи ([x] my.jar в Order and Export -Tab из проекта библиотеки)

Есть ли чистый способ заставить это работать?

4b9b3361

Ответ 1

Это четко указано в offcial API здесь:

Проект библиотеки может включать библиотеку JAR

Вы можете разработать проект библиотеки, который сам включает библиотеку JAR, однако вам нужно вручную отредактировать путь сборки зависимого проекта приложения и добавить путь к файлу JAR

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

Обновление с SDK r17:

Это автоматически обрабатывается ADT сейчас, ознакомьтесь с новой функцией для выпуска ADT 17.0.0 здесь:

Добавлена ​​возможность автоматической настройки JAR-зависимостей. Любые файлы .jar в папке /libs добавляются в конфигурацию сборки (подобно тому, как работает система сборки Ant). Кроме того, файлы .jar, необходимые для проектов библиотек, также автоматически добавляются к проектам, которые зависят от этих проектов библиотеки. (подробнее)

Ответ 2

Для тех, кто следил за шагами (даже проверьте проекты в разделе "Заказ и экспорт" ) и все еще имеет java.lang.ClassNotFoundException в API 17, последний шаг - проверить, что ваш компилятор не работает с Java 1.7, Если это 1.7, то вы должны изменить его на 1.6 для всех своих проектов. После этого он попросит перестроить все проекты и успешно запустить на моем телефоне:)

Чтобы изменить версию java-компиляции в eclipse, она находится в: Свойства проектa > Компилятор Java > Уровень соответствия компилятора: 1.6

Ответ 3

Перейдите к project properties -> build path-> libraies

Если вы видите ваши файлы в jar, как этот

snmp4j.jar - e:\software\jars

Может ли ваша проблема

Добавьте папку libs в проект и скопируйте файл jar в эту папку. Щелкните правой кнопкой мыши файл jar и выберите build path -> add to build path. Затем вы можете увидеть свою банку как

snmp4j.jar  - project_name/libs 

Это сработало для меня.

Ответ 4

У меня было два проекта с использованием одной и той же библиотеки: одна работала, другая - с java.lang.NoClassDefFoundError. После того, как мне ничего не помогло, я просмотрел файл project.properties в корневом каталоге моего проекта. Рабочий проект имел строку android.library.reference (последняя строка ниже), сбойной:

# Project target.
target=android-17
android.library.reference.1=../my-library-project

Я вручную добавил строку и начал работать! (Да, я попробовал оба свойства проекта - путь сборки java - проекты и (проект) - путь сборки java - порядок и экспорт - ничего не помогло.)

PS Кстати, "свойства проекта" также имеют вкладку "ссылки на проекты". Не знаю, будет ли это работать.

Ответ 5

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

Кажется, что библиотеки должны находиться в папке libs с этого момента

Ответ 6

У меня была аналогичная проблема, и не решены решения, установленные здесь.

Краткая версия: JAR был скомпилирован в Java 1.7 и не найден Dalvik.

Мы создаем внутренний JAR, который мы передаем через бэкэнд и мобильные клиенты с Maven. Проблема заключалась в том, что JAR был скомпилирован с Java 1.7. Androids dalvik поддерживает только Java 1.5 и 1.6. Вот почему все отлично работает в Eclipse, поскольку оно не скомпилировано в dalvik на данный момент.

Мы даже указали целевую и исходную версию в плагине компилятора Maven для компиляции с Java 1.6. Это не сработало, потому что на машине для сборки был установлен только JDK 1.7. Небольшая заметка внизу страницы Maven дала нам подсказку: Note: Merely setting the target option does not guarantee that your code actually runs on a JRE with the specified version.

Чтобы узнать, есть ли у вас эта проблема, переименуйте файл *.jar в *.zip, распакуйте его и посмотрите в файле MANIFEST.MF для параметра Build-Jdk:, чтобы узнать, какая версия Java действительно скомпилировала ваш JAR.

Ответ 7

Еще одна вещь, на которую нужно обратить внимание - это имена пакетов библиотек.

Если вы используете ADT21, и у вас есть библиотеки с одинаковым именем пакета, во время компиляции будет ошибка, но она все равно будет компилироваться и запускаться в Eclipse, предоставляя APK, который пропускает некоторые классы ресурсов. Следовательно, сбой при запуске приложения.

Если вы скомпилируете его с помощью ANT, вы увидите ошибку компиляции, в которой две или более библиотеки используют одно и то же имя пакета.

Чтобы исправить это, переименуйте проект библиотеки с помощью Android Tools → Rename Application Package. Тогда все вернется к нормальной жизни.

Мне потребовался почти целый день, чтобы понять это...