Создание продукта SDK: как добавить собственный lib (.so) и банку с SDK, который я создаю?
Я создаю виджет, который мы предоставим конечным пользователям разработчиков, и состоит из .jar
и собственной библиотеки (.so
), построенной с использованием NDK. JAR имеет интерфейс JNI для динамической библиотеки.
Очень ясно, как включить внешний .jar
в проект, но не как включить зависимую динамическую библиотеку.
-
Как мне упаковать и построить .jar
и .so
? Каковы лучшие практики здесь?
-
Я могу создать JAR файл с помощью команды JDK jar. Мне нужно запустить dx.bat на банке для преобразования в байт-код Dalvik?
-
Мне нужно создать образец проекта, показывающий виджет в действии. Как включить этот .jar
и .so
в примерный проект, демонстрирующий, как использовать виджет?
Ответы
Ответ 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)