Создание so библиотеки для андроид

Русские Блоги

Как Android вызывает сторонние SO библиотеки

Описание проблемы: Как Android вызывает сторонние SO библиотеки;
известные условия: Библиотека SO — это библиотека подключений версии Android (файл * .so), которая предоставляет подробные инструкции по интерфейсу;
Знай решение:
1. Поместите файл SO непосредственно в libs / armeabi, затем System.loadLibrary («xxx») в коде, затем в public native static int xxx_xxx_xxx (), затем вы можете напрямую вызвать метод xxx_xxx_xxx ();
2. Второе решение состоит в том, чтобы создать свой собственный файл SO, вызвать сторонний SO в своем собственном файле SO, а затем вызвать свой собственный SO в программе. Это более сложно. Требуется создать файл класса Java, сгенерировать файл .h и написать Исходный файл C включает в себя файл .h, сгенерированный перед включением соответствующего метода, и, наконец, использует скрипт ndk-build в комплекте разработки android NDK для создания соответствующей общей библиотеки .so;
Решить:
1. Возможны ли вышеуказанные два варианта? В чем проблема, если это невозможно?
2. В чем разница между двумя схемами? Почему вторые решения используются в основном в Интернете?
3. Существует только один файл * .so, и предоставляется подробное описание интерфейса. Можно ли его использовать в ANDROID?

Прежде всего, это зависит от того, является ли этот SO SO спецификации JNI, например, возвращает ли он тип, который JNI не поддерживает напрямую. Другими словами, может ли это так называться непосредственно как JNI. Если ответ «нет», вы можете выбрать только второй вариант.

Если ответ «да», это зависит от того, хотите ли вы, чтобы эта библиотека SO была напрямую представлена ​​слою JAVA. Если ответ «нет», вы можете выбрать только второе решение, например, вы также являетесь поставщиком библиотеки.

Как правило, если у вас есть только SO, это означает, что это предоставляется вам другими, и вы можете попросить другую сторону предоставить вам поддержку файлов вызовов JAVA.

1. Это зависит от того, соответствует ли SO спецификации вызова JNI. Это зависит от ваших собственных пожеланий.
2. Поскольку второй метод является наиболее гибким, могут быть реализованы различные ситуации.
3. Да

Источник

Создание standalone библиотеки под android

В этой статье я расскажу как создать библиотеку, которая использует другие библиотеки и при этом уместить всё в одном jar.

Допустим мы пишем библиотеку, она использует другие библиотеки и, в частности, для примера, support library. Если бы мы использовали maven, то в pom файле просто прописали зависимости и не парились. Но что если нашу библиотеку будут использовать люди, которые не пользуются системами сборок или пользуются ant’ ом?

Мы можем положить зависимости рядом с нашим jar. Но тогда неизбежны конфликты библиотек разных версий, например, если мы используем одну версию support library, а в самом приложении другая. Тогда придется руками одну из них удалять.

Можно пойти другим путем, вспомним что jar это обычный zip файл. Мы распакуем все зависимости, получим байт-код в виде .class файлов, далее компилируем код нашей библиотеки, кладем все .class файлы в одно место и собираем из них jar. Но если в приложении используются те же библиотеки что и у нас, то получим ошибку что в проекте два одинаковых класса.

Для решения этой проблемы воспользуемся утилитой jarjar. Она переименовывает все классы в jar файле. На примере support library — все классы находятся в пакете android.support.v4

Создадим правило для переименования классов android.support.v4.* в inner.android.support.v4.*
и сохраним в файл rules.txt

В итоге получили jar’ку с переименованными классами. Далее мы распаковываем все наши зависимости с переименованными классами и компилируем. Получаем библиотеку, которая содержит весь код нужный для выполнения.

Читайте также:  Boom beach взлом андроид

Наша библиотека содержит код всех зависимостей, которые могут весить немало. Чтобы уменьшить размер применим proguard для удаления неиспользуемых классов и методов.

И в заключение небольшой скрипт на gradle который всё это делает

Вои и всё, после выполнения скрипта мы получим proguard_library.jar, который можно добавлять к приложению и использовать.

В моём случае библиотека использует support library и dropbox sdk, и весит 50 кБ.

Этим же способом можно уменьшать размер вашего apk, все зависимости можно подключать не как jar файлы, а распаковывать в .classes и применять proguard, тогда он удалит неиспользуемые классы из библиотек. Так можно подключать к проекту тяжелые фреймворки не боясь увеличения размера apk

Источник

Сборка open-source библиотек на Android NDK

В процессе работы с Android NDK я столкнулся с проблемой сборки уже существующих Linux библиотек на Android NDK. Так как материала не слишком много в этой статье поделюсь своим опытом. В Андроиде я новичек, так что если найдете ошибки — пишите:)

Чтобы пример был не самым простым и при том полезным — возьмём библиотеку libFLAC. Этот даст возможность декодировать .flac файлы. По данному мануалу, я надеюсь, соберутся большинство других библиотек.

Кроме неё нам понадобится:

  • Android NDK, r5b (http://developer.android.com/sdk/ndk/index.html)
  • libOgg (http://www.xiph.org/downloads/)
  • libVorbis (там же, где и libOgg).

Создание проекта

Создаём стандартный Android проект, в нем создаём папку jni и распаковываем туда libogg, libvorbis, libflac.

Сборка

Приступим к первому этапу. Для сборки я использовал такой скрипт:

Для libVorbis придется его немного изменить:
LDFLAGS будет таким:

Для libflac изменим добавим в libs -lvorbis.

Рассмотрим структуру скрипта по порядку. Строка export CC — путь к компилятору Android NDK. Тут: export LDFLAGS можем задавать директории, где искать библиотеки, а в LIBS подключать их. В этой строке: export CPPFLAGS подключаем headers дополнительных библиотек.

Выполняете нужные скрипты в корне каждой из библиотек. После сборки, если все прошло успешно вы получаете библиотеки, которые уже можно компилировать на NDK.

Подготовка Android.mk

Итак, для начала создадим Android.mk, вида:
include $(all-subdir-makefiles)
В папках: jni, jni/libogg, jni/libflac, jni/libvorbis
Этот скрипт означает, что будут подключены все Android.mk в поддиректориях.

Для создания Android.mk в папках jni/libogg/src, jni/libvorbis/lib, jni/libflac/src будем использовать все Makefile.am в тех же папках.

jni/libogg/src

В Makefile.am ищем строки:
libogg_la_SOURCES = framing.c bitwise.c — это все что нам надо. Получаем стандартный Android.mk вида:

Думаю тут объяснять ничего не надо. Идём дальше.

jni/libvorbis/lib

Тут тоже все просто. Находим строку: libvorbis_la_SOURCES и подулючаем все файлы, что там есть. Получаем такой Android.mk:

jni/libflac/src

Процесс тот же, но файлов намного больше и они в поддиректориях. Я решил все что есть собрать в одну библиотеку, чтоб было проще, поэтому получил такой скрипт:

NDK BUILD

Выполняем ndk-build (этот скрипт находится в папке NDK) и видим что все компилируется, но flac даёт следующую ошибку:
/home/user/workspace/w/testOGG/jni/flac-1.2.1/src/libFLAC/format.c:60: error: ‘VERSION’ undeclared here (not in a function)
/home/user/workspace/w/testOGG/jni/flac-1.2.1/src/libFLAC/format.c:66: error: expected ‘,’ or ‘;’ before ‘VERSION’
make: *** [/home/user/workspace/w/testOGG/obj/local/armeabi/objs/FLAC/libFLAC/format.o] Ошибка 1
Проблема в том, что константа VERSION определена в makefile, который мы не подключали. Самым простым выходом я вижу создать эту константу в самом format.c вот так:
#define VERSION «1.2.1»
Все теперь ошибок нет. При компиляции получаем:
Install : libFLAC.so => libs/armeabi/libFLAC.so
Install : libogg.so => libs/armeabi/libogg.so
Install : libvorbis.so => libs/armeabi/libvorbis.so
В каталогах должны появится такие файлы и папки:

Теперь осталось последнее — протестировать все ли работает. Я переделал на скорую руку из стандартных примеров декодирования аудио через libflac. Декодировал из flac файла в wav. Так как код скрипт великоват вы можете протестировать работу на этом apk:тестовый apk файл
(чтоб все сработало, надо чтоб в sdcard был файл output.flac с:
05-20 14:18:42.783: INFO/FLAC(427): sample rate: 44100 Hz
05-20 14:18:42.783: INFO/FLAC(427): channels: 2 Hz
05-20 14:18:42.783: INFO/FLAC(427): bits: 16 Hz, он будет перекодирован в test2.wav. При работе программы ничего писать не будет (только в логи). Протестировано на эмуляторе, HTC Wildfire и Samsung galaxy tab (везде Android 2.2). Процесс занял не более минуты при работе с 20 мегабайтным flac файлом. По окончанию работы отобразится Hello world.
Вот исходники всего проекта:
исходники
Удачи!

Читайте также:  Обновление до android jelly

Источник

13 сентября 2016 г. Как создать собственную библиотеку для Android на примере BottomTabLayout

Рано или поздно у всех разработчиков накапливается достаточное количество готовых решений и хочется поделиться ими с друзьями, сотрудниками или со всем миром. Но к сожалению у большинства «руки не доходят», так как нужно оформить решение как отдельную библиотеку и потом разобраться как залить ее на открытый репозиторий. К тому же бытует мнение что это не так просто. Так вот, в этой статье мы разрушим этот миф, так как с приходом Gradle в стек технологий Android все стало намного проще.

Использование BottomTabLayout

Понятно, что первый шаг — написание собственной библиотеки. В этом примере я использую библиотеку BottomTabLayout. Эта библиотека позволяет в несколько строчек добавить нижний TabLayout, который перекочевал к нам в Android из мира iOS.

1. Набор табов задается через xml-файл ресурсов menu. Например:

2. В коде выше свойство icon — это ресурс selector , который мы создаем в drawable :

Состояния state_selected и default здесь обязательные, так как нам нужно выделять выбранный таб.

3. Создаем selector для текста:

4. Создаем стиль текста:

5. Добавляем BottomTabLayout на разметку activity :

6. Настраиваем в классе activity :

7. В нашем примере при переключении таба меняется фрагмент в контейнере:

Вот такая вот простенькая библиотека. На GitHub можно подробней ознакомится с BottomTabLayout.

Публикация Android-библиотеки

Теперь я расскажу вам, как имея похожие наработки, поделиться ими с миром.

Создание модуля в Android Studio

1. Для начала создаем проект в Android Studio. Для удобства модуль app переименовываем в sample. Здесь будет лежать пример использования нашей библиотеки.

2. Создаем новый модуль:

3. Тип модуля выбираем Android Library:

4. Это и будет наша библиотека, поэтому название соответствующее — bottomtablayout.

5. Теперь settings.gradle у нас должен выглядеть так:

6. В модуле sample, в build.gradle добавляем зависимость:

Это делается временно, пока наша библиотека существует только локально.

7. Теперь мы можем написать нашу библиотеку (или перенести готовый код) и протестировать ее в модуле sample.

8. Когда библиотека готова, заливаем ее на свой GitHub-аккаунт.

9. Пишем туториал в README.md.

Добавление библиотеки на Bintray

1. Если библиотека готова и вы считаете что пора миру ее увидеть, заходим и регистрируемся на сайте Bintray.

2. В файл build.gradle проекта добавляем зависимость:

3. В build.gradle-файле модуля библиотеки (в нашем случае это bottomtablayout) применяем плагин:

И в этом же файле:

  • groupId — пакет (может отличаться от пекейджа самого модуля). Рекомендую называть groupId так: com.github. , поскольку если вы когда-то захотите залить свою библиотеку на Maven Central нужно быть владельцем домена который фигурирует в названии groupId .
  • artifactId — название модуля.
  • publishVersion — версия публикации.
  • desc — описание библиотеки.
  • licences — лицензия.
  • uploadName — название библиотеки.
  • website — ссылка на GitHub проекта.

4. Далее нам нужен API Key вашего аккаунта на Bintray. Заходим на страницу вашего профайла:

5. Ищем кнопочку Edit и переходим по ней:

6. Теперь переходим по пункту меню API Key:

7. Сохраняем ключ в надежном месте.

8. Открываем терминал в Android Studio и выполняем:

9. Дожидаемся сборки и отгрузки библиотеки на сервер.

10. Теперь открываем сайт Bintray и ищем переход на страницу свежедобавленной библиотеки.

11. Пока что для того, чтобы подключить нашу библиотеку нужно добавить ссылку на репозиторий в build.gradle-файл проекта:

Какой-то лишний шаг получается, правда? Значить нужно это исправить 🙂

Добавление Android-библиотеки в jCenter

С недавних пор, репозиторием по умолчанию в Android считается jCenter (до этого был Maven Central). Благо, что добавление библиотеки в jCenter делается в один клик.

1. На странице нашей библиотеки переходим по ссылке add to jCenter и отправляем запрос на добавление. В течении суток библиотека будет добавлена в jCenter и вас оповестят соответствующим письмом на почту.

Читайте также:  Android incorporated что это

2. Теперь есть возможность подключить библиотеку через build.gradle модуля, добавив зависимость в dependencies:

Завершение

Поздравляю! Ваша библиотека вышла в свет и уже можно начинать хвастаться ею перед друзьями, пиарить в пабликах и смотреть, как страница библиотеки на гитхабе набирает звездочки и форки.

UPD: читайте о наших Android-библиотеках в новой статье!

Нужен MVP, разработка под iOS, Android или прототип приложения? Ознакомьтесь с нашим портфолио и сделайте заказ уже сегодня!

Источник

Публикация Android библиотеки

Недавно у меня появилось желание попробовать создать свою собственную Android библиотеку и выложить ее на Maven Central репозиторий.

Это оказалось не так просто, как я думал. В интернете полно непонятных статей на эту тему, в которых легко запутаться.

Я решил поделиться процессом публикации моей библиотеки Awesome-Buttons.

Ну что ж, приступим.

Регистрация на Sonatype JIRA и создание Issue

Перейдите на сайт Sonatype JIRA и создайте себе аккаунт.

Теперь войдите в аккаунт и создайте новый Issue :

Заполните всю необходимую информацию.

Обратите внимание на Group Id . Обычно в качестве его указывается доменное имя в обратном порядке.

Если у вас есть свой сайт или сайт библиотеки, то вы можете использовать его доменное имя (например: ru.freeit256 ), но для этого нужно будет дополнительно прописать запись в вашем регистраторе домена (после создания Issue вы увидите информацию как это сделать).

Я использовал другой подход: указал свой Github в качестве Group Id

Также для того, чтобы использовать Github в качестве Group Id вам нужно создать пустой репозиторий с именем OSSRH-74088

Не забудьте отправить ваше Issue на проверку и дождаться статуса CLOSED

Создаем Android библиотеку в Android Studio

Сначала создайте любое пустое приложение с app модулем.

Затем вы можете либо добавить модуль Android библиотеки, либо изменить текущий модуль на библиотечный. Читайте об этом на официальном сайте

Генерации GPG ключа

Перед публикацией необходимо сгенерировать пару GPG ключей.

Для генерации ключей выполните следующую команду:

Основные параметры при создании ключей:

формат шифрования: RSA and RSA

размер: 4096 бит

срок годности ключа можно указать 0 (никогда не истечет)

имя, email и комментарий укажите свои

Чтобы посмотреть все сгенерированные ключи выполните команду:

Обратите внимание, последние 8 символов это ID ключа:

Для подписи библиотеки мы будем использовать приватный ключ, а чтобы пользователи смогли удостовериться, что библиотека принадлежит нам, мы должны выложить публичный ключ на общедоступный сервер, например keyserver.ubuntu.com:

Чтобы получить приватный ключ для подписи нужно выполнить:

Вуаля! Позже он нам понадобится.

Настройка библиотеки для публикации:

Добавляем плагин io.github.gradle-nexus в корневой файл build.gradle :

Далее нам нужно создать два скрипта для модуля и корня нашей библиотеки.

Создадим в корне проекта папку scripts , и добавим новый скрипт publish-module.gradle :

Также нам нужно добавить скрипт publish-root.gradle :

Теперь нам нужно добавить maven-publish плагин и некоторые константы в начало build.gradle файла нашего модуля:

И самый важный момент, файл local.properties :

Публикация

После основных настроек, зайдите на Nexus Repository Manager и войдите под учетными данными JIRA Sonatype.

Далее переходим во вкладку Staging Profiles и выбираем необходимый профиль.

Копируем sonatypeStagingProfileId из адреса сайта и указываем его в local.properties файле:

Переходим к публикации.

Далее у вас есть два варианта зарелизить либу: вручную через графический интерфейс или с помощью gradle задачи.

Первый

Зайдите на сайт Nexus Repository Manager , перейдите во вкладку Staging Repositories и выберите необходимый репозиторий.

Чтобы выпустить релиз библиотеки нужно воспользоваться двумя командами close и release .

Для отмены релиза юзайте drop

Второй

Выполните команду, которая сама закроет и зарелизит вашу либу:

Заключение

Вы уже убедились, что процесс публикации Andorid либы весьма затратный и рутинный.

Я постарался изложить только основные моменты. Возможно у вас возникнут какие-либо ошибки, которые вам придется самим решать ну и конечно же гуглить!

Такова жизнь прогера: постоянно гуглить. 🙂

Надеюсь, что статья оказалась вам полезной.

Желаю всем хорошего кода и побольше успешных релизов! 🙂

Источник

Оцените статью