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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

enter image description here

Ответ 2

Для этого вам следует использовать стандартные инструменты построения, включенные в SDK. Если вы включаете файлы .jar, которые вам нужны в каталоге /lib вашего проекта, процесс сборки ant преобразует включенные файлы классов в формат байт-кода Dalvik и включает их в ваш файл classes.dex для приложения. Добавьте файл build.properties к корню проекта, а также одну строку:

external.libs.dir=lib

В зависимости от версии вашего SDK и его конфигурации вам может потребоваться разместить банку в libs, а не lib.

Что касается .so, я предполагаю, что он правильно скомпилирован с использованием Android NDK или с помощью сборки script, которая использует правильные флаги компилятора и компилятора, необходимые для успешной связи общего объекта на Android. Если это так, вы можете включить файл .so в libs/armeabi, и они также будут добавлены в банку. Кроме того, динамический загрузчик библиотеки будет знать, как искать в этом месте в .jar, когда вы на самом деле пытаетесь загрузить библиотеку из кода Java.

Ответ 3

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

Ответ 4

Добавьте строки ниже к android.mk.

include $(BUILD_PACKAGE)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := alias:libs/your.jar

include $(BUILD_MULTI_PREBUILT)