Создание SDK для продукта. Как добавить собственную библиотеку (.so) и jar с SDK, который я создаю?
Я создаю виджет, который мы предоставим разработчикам конечным пользователям, и он состоит из .jar
и родная библиотека (.so
) построен с использованием NDK. JAR имеет интерфейс JNI с динамической библиотекой.
Это очень ясно, как включить внешний .jar
в проекте, но не как включить зависимую динамическую библиотеку.
Как мне упаковать и собрать
.jar
а также.so
? Каковы лучшие практики здесь?Я могу создать файл JAR, используя команду jar JDK. Нужно ли мне запускать dx.bat на банке, чтобы конвертировать в байт-код Dalvik?
Мне нужно создать пример проекта, показывающий виджет в действии. Как мне это включить
.jar
а также.so
в примере проекта, который демонстрирует, как использовать виджет?
4 ответа
Я потратил некоторое время на это, и я просто не могу понять, почему это не написано в документации wikitude.... в любом случае следите за этими изменениями!
- зайдите в windows / настройки / android / build
- снимите галочку с первого и второго варианта
- Извлеките файлы из wikitudedk.jar с помощью winrar, как будто это архив, найдите libarchitect.so и скопируйте его в / libs / libs / armeabi /
- добавьте wikitudedk.jar в путь сборки
Для этого вы должны использовать стандартные инструменты сборки, включенные в SDK. Если вы включите нужные файлы.jar в /lib
В директории вашего проекта процесс сборки ant преобразует включенные файлы классов в формат байт-кода Dalvik и включит их в файл classes.dex для приложения. Добавить build.properties
также файл в корне вашего проекта, одной строкой:
external.libs.dir=lib
В зависимости от версии вашего SDK и его конфигурации, вам может понадобиться поместить банку в libs
скорее, чем lib
,
Что касается.so, я предполагаю, что он правильно скомпилирован с использованием Android NDK или с помощью сценария сборки, который использует надлежащие флаги компилятора и компилятора, необходимые для успешного связывания общего объекта на Android. Если это так, вы можете включить.so файл в libs/armeabi
и они будут добавлены в банку, а также. Кроме того, динамический загрузчик библиотеки будет знать, что искать в этом месте в.jar, когда вы на самом деле пытаетесь загрузить библиотеку из кода Java.
Используя ADT 12, я выполнил это следующим образом:
1) Экспортируйте JAR из вашей библиотеки с помощью SO-файла, используя Eclipse. Убедитесь, что вы исключили AndroidManifest.xml. Это будет включать в себя исходный код и другие данные, поэтому, если вы распространяете, вы хотите удалить эти ненужные биты с помощью любой утилиты ZIP.
2) Создайте каталог в исходном дереве вашего приложения (я использую каталог "lib") и скопируйте в него JAR библиотеки.
3) Щелкните правой кнопкой мыши проект в Eclipse и выберите "Настроить путь сборки". Добавьте JAR и укажите его на JAR внутри дерева исходных текстов приложения.
4) В настройках Eclipse выберите раздел Android/Build и снимите флажок "Автоматически обновлять папку ресурсов и ресурсов при сборке". Ниже вы увидите параметр "Принудительная ошибка, когда внешние файлы jar содержат собственные библиотеки". Существует ошибка ADT, которая предположительно будет исправлена в R17, которая использует неправильные настройки. Как только оно будет исправлено, вы будете использовать "Force error" (убедитесь, что оно не отмечено).
5) После того, как вы создадите приложение APK, у вас будет файл libs/armeabi/libXXXX.so. Это не будет автоматически распаковано при установке. Вам нужно будет написать код, чтобы извлечь его из вашего APK-файла в ваш каталог данных, а затем использовать System.load для файла.so в вашем каталоге данных.
У меня есть двунаправленные вызовы JNI, идущие из динамически загруженного файла, и даже использую для этого dlopen(), чтобы выполнять свои собственные процедуры регистрации плагинов.
Добавьте следующие строки в android.mk
,
include $(BUILD_PACKAGE)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := alias:libs/your.jar
include $(BUILD_MULTI_PREBUILT)