2013-07-10 4 views
1

У меня есть проект библиотеки Android (A), который используется несколькими проектами приложений для Android. Библиотека jar, размещенная внутри папки libs проекта библиотеки, ссылается на com.lib.R файлы ресурсов (например, изображения) внутри этого проекта.Обратитесь к ресурсам android из библиотеки jar

Когда прикладной проект (B) использует эту библиотеку, он может вызывать некоторый код, который запускает файл jar в папке libs, чтобы ссылаться на ресурсы, на которые ссылаются com.lib.R. К сожалению, любая попытка доступа к этим ресурсам приводит к следующей ошибке.

java.lang.NoClassDefFoundError: com.lib.R$layout 

Если доступ к этим ресурсам из src/ папки Lib A или src/ папку Project B, они правильно разрешаться в int значения и может быть использован, но я бы предпочел не делать этого и сохранить код внутри папки libs.

Мой вопрос - Почему это происходит и как его решить? Одна работа заключается в том, чтобы получить идентификатор ресурса программным путем, используя resource.getIdentifier(), но это может стать очень быстрым. Есть ли способ, которым я все еще могу использовать com.lib.R из библиотеки jar под libs без необходимости ее решения вручную с помощью вспомогательных методов?

Вот иллюстрация, которая поможет вам. Доступ

ресурсов из библиотеки

Resource access from library

+0

«Библиотека, размещенная внутри папки libs проекта библиотеки, ссылается на com.lib.R ресурсов (скажем, изображений) внутри этого проекта », которые никогда не должны компилироваться, поскольку по определению этот JAR не является« com.lib »и не имел доступа к' com.lib.R', когда он был скомпилирован. не знаю, как вы получили этот JAR, и я понятия не имею, почему вы ожидаете, что вы делаете, чтобы быть надежным. – CommonsWare

+0

@CommonsWare Хороший улов. Я получил банку, сначала определяя ресурсы, а затем ссылаясь на них из другого проекта. Затем java-файлы были скомпилированы и помещены в папку 'libs' библиотеки как банку. Причина этого заключалась в том, чтобы не подвергать java-файлы конечным пользователям. Я открыт для ваших соображений о том, почему это ненадежно и как я могу улучшить его. –

ответ

1

и как я могу улучшить его

Я буду считать, что ваша цель состоит в том, чтобы иметь возможность распространять и B в исходной форме, но не в содержании some_lib.jar («Причина, по которой это было сделано, заключалась в том, чтобы не подвергать java-файлы конечным пользователям»). В этом случае:

Шаг 1: Создайте другой проект библиотеки (L), содержащий исходный код из some_lib.jar и все ресурсы, которые она ссылается (перемещение этих ресурсов из А и в L)

Шаг # 2: Создание проекта библиотеки распределения (LD) после the recipe that I just wrote about earlier today

Шага № 3: есть в зависимости от LD, чтобы забрать ресурсы вместе с собранной баночкой единиц коды

Шаг # 4: Когда вы распространяете источник, также распространять LD

Моя надежда состоит в том, что путем создания формального проекта библиотеки для some_lib «s кода, и при наличии ресурсов, необходимых объявленным в этой библиотеке проекта, вы сможете составить JAR, который будет работать для B.

Теперь это сложнее, чем я пытался, и поэтому вполне возможно, что это приведет к тому же результату, который вы испытываете. Если это так, то вам не повезло, по крайней мере, до тех пор, пока вы не перейдете на систему сборки на основе Gradle, и в этом случае L/LD станет файлом AAR и, надеюсь, будет работать.

Смежные вопросы