Создание SDK для продукта. Как добавить собственную библиотеку (.so) и jar с SDK, который я создаю? - PullRequest
41 голосов
/ 03 февраля 2011

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

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

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

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

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

Ответы [ 4 ]

23 голосов
/ 21 марта 2012

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

  • Перейдите в окна / настройки /android / build
  • снимите флажок с первого и второго параметра
  • извлекать файлы из wikabilitiesdk.jar с помощью winrar, как будто это архив, выполнить поиск libarchitect.so и скопировать его в / libs / libs /armeabi /
  • добавить файл wikitudedk.jar на путь сборки

enter image description here

10 голосов
/ 03 февраля 2011

Для этого вы должны использовать стандартные инструменты сборки, включенные в 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.

8 голосов
/ 22 декабря 2011

Используя 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 () для выполнения своей процедуры регистрации пользовательских плагинов.

1 голос
/ 31 октября 2013

Добавьте следующие строки в android.mk.

include $(BUILD_PACKAGE)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := alias:libs/your.jar

include $(BUILD_MULTI_PREBUILT)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...