Создание продукта SDK: как добавить собственный lib (.so) и банку с SDK, который я создаю?

Я создаю виджет, который мы предоставим конечным пользователям разработчиков, и он состоит из .jar и собственной библиотеки ( .so ), построенной с использованием NDK. JAR имеет интерфейс JNI для динамической библиотеки.

Очень ясно, как включить внешний проект .jar в проект, но не как включить зависимую динамическую библиотеку.

  1. Как я упаковываю и создаю .jar и .so ? Каковы лучшие практики здесь?

  2. Я могу создать JAR-файл с помощью jar-команды JDK. Нужно ли мне запускать dx.bat на банке для преобразования в байт-код Dalvik?

  3. Мне нужно создать образец проекта, показывающий виджет в действии. Как включить этот .jar и .so в примерный проект, демонстрирующий, как использовать виджет?

Solutions Collecting From Web of "Создание продукта SDK: как добавить собственный lib (.so) и банку с SDK, который я создаю?"

Я потратил некоторое время на это, и я просто не могу понять, почему это не написано на документации wikitude …. в любом случае следуйте этим изменениям!

  • Перейти к окнам / предпочтениям / android / build
  • Снимите первый и второй параметры
  • Извлеките файлы из wikitudesdk.jar с winrar, как если бы это был архив, выполните поиск libarchitect.so и скопируйте его в / libs / libs / armeabi /
  • Добавьте wikitudesdk.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 и снимите флажок «Автоматически обновлять папку« Ресурсы и активы »при сборке». Вы увидите вариант ниже, в котором говорится: «Силовая ошибка, когда внешние банки содержат встроенные библиотеки». Существует ошибка 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)