Android shared library что это за программа и нужна

Пытаюсь написать пограмму для Android, используя C++ и SDL.
Собираю SDL и main как SHARED_LIBRARY.
код main взял из примера. http://pastebin.com/0aZc4pk4
Все работает.

Теперь добавляю еще одну библиотеку, lib1 например.
Пересобираю, линкую и пиложение перестает запускаться.
В visualGdb лог кристально чист, в eclipse — can’t load shared library.

Что я делаю не так?

+ Android.mk для SDL

LOCAL_PATH := $(call my-dir)

LOCAL_SRC_FILES :=
$(subst $(LOCAL_PATH)/,,
$(wildcard $(LOCAL_PATH)/src/*.c)
$(wildcard $(LOCAL_PATH)/src/audio/*.c)
$(wildcard $(LOCAL_PATH)/src/audio/android/*.c)
$(wildcard $(LOCAL_PATH)/src/audio/dummy/*.c)
$(LOCAL_PATH)/src/atomic/SDL_atomic.c
$(LOCAL_PATH)/src/atomic/SDL_spinlock.c.arm
$(wildcard $(LOCAL_PATH)/src/core/android/*.cpp)
$(wildcard $(LOCAL_PATH)/src/cpuinfo/*.c)
$(wildcard $(LOCAL_PATH)/src/events/*.c)
$(wildcard $(LOCAL_PATH)/src/file/*.c)

Android: Урок 18. Что такое ListView и Adapters?


$(wildcard $(LOCAL_PATH)/src/haptic/*.c)
$(wildcard $(LOCAL_PATH)/src/haptic/dummy/*.c)
$(wildcard $(LOCAL_PATH)/src/joystick/*.c)
$(wildcard $(LOCAL_PATH)/src/joystick/android/*.c)
$(wildcard $(LOCAL_PATH)/src/loadso/dlopen/*.c)
$(wildcard $(LOCAL_PATH)/src/power/*.c)
$(wildcard $(LOCAL_PATH)/src/power/android/*.c)
$(wildcard $(LOCAL_PATH)/src/render/*.c)
$(wildcard $(LOCAL_PATH)/src/render/*/*.c)
$(wildcard $(LOCAL_PATH)/src/stdlib/*.c)
$(wildcard $(LOCAL_PATH)/src/thread/*.c)
$(wildcard $(LOCAL_PATH)/src/thread/pthread/*.c)
$(wildcard $(LOCAL_PATH)/src/timer/*.c)
$(wildcard $(LOCAL_PATH)/src/timer/unix/*.c)
$(wildcard $(LOCAL_PATH)/src/video/*.c)
$(wildcard $(LOCAL_PATH)/src/video/android/*.c))

LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES
LOCAL_LDLIBS := -ldl -lGLESv1_CM -lGLESv2 -llog

+ Android.mk для main

LOCAL_PATH := $(call my-dir)

LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../lib

LOCAL_SRC_FILES +=
$(subst $(LOCAL_PATH)/,,
$(wildcard $(LOCAL_PATH)/*.cpp) )

LOCAL_SHARED_LIBRARIES := SDL2 lib1

LOCAL_LDLIBS := -ldl -lGLESv1_CM -lGLESv2 -llog

+ Android.mk для lib1

LOCAL_PATH := $(call my-dir)

LOCAL_SRC_FILES +=
$(subst $(LOCAL_PATH)/,,
$(wildcard $(LOCAL_PATH)/*.cpp) )

LOCAL_LDLIBS := -ldl -lGLESv1_CM -lGLESv2 -llog
LOCAL_SHARED_LIBRARIES := SDL2

// h
struct Foo
<
static void foo();
>;

//cpp
#include «foo.h»

#1
16:22, 5 мар 2013

Нужно руками загрузить зависимости либы в правильном порядке из явы. Предположу, что у тебя main зависит от SDL, тогда:

System.loadLibrary( «libSDL.so»); System.loadLibrary( «lib1.so»);

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

Урок 33. SharedPreferences — сохранение данных в приложениях | Уроки Android Studio

#2
17:21, 5 мар 2013

bazhenovc
Большое спасибо, пришлось поковырять SDLActivity.java; работает.

>статическими либами
Поздно 😉

Интересно: есть ли альтернативный способ — ковырять кишки SDL мне кажется как-то не Ъ.

#3
17:45, 5 мар 2013

Try
> пришлось поковырять SDLActivity.java
чтоб загрузить lib1.so? почему бы не загрузить ее в своей activity, в той которая наследуется от SDLActivity?

#4
17:52, 5 мар 2013

LuckyMan
На моей стороне как-бы нет Java кода, а SDLActivity это уже запчасти SDL’а.
Похоже рано-или поздно код на жабе появиться, но как-бы не хочется еще и в нем копаться.

#5
17:59, 5 мар 2013

Try
ну не знаю, в инструкции к SDL написано
«Create a Java class extending SDLActivity and place it in a directory under src matching the package, e.g. src/com/gamemaker/game/MyGame.java»
я так делал и не думал, что можно как то по-другому

#6
11:03, 22 апр 2013

Try
Привет. А случайно не подскажешь как решить проблему с потерей контекста?
Или он не теряется? Тогда как определить тот момент когда надо перезагрузить ресурсы и что именно перезагружать?

P.S. Можете скинуть рабочий проект SDL2 для android в котором решена проблема потери контекста. Я вот мучаюсь мучаюсь, а до меня всё ни как не доходит что делать.

Источник: gamedev.ru

30 Android-библиотек и инструментов, которые не должны пройти мимо вас в 2018 году

30 Android-библиотек и инструментов, которые не должны пройти мимо вас в 2018 году

В течение лета 2018 года было разработано и обновлено множество отличных Android-библиотек и инструментов.

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

Надеюсь, вам понравится. Давайте начнём!

1. LayoutManagerGroup

Это библиотека, которая предлагает набор LayoutManagers для RecyclerView, которые помогут достичь таких эффектов, как на gif ниже.

Эти LayoutManagers в основном расширяют RecyclerView.LayoutManager или просто LinearLayoutManager и добавляют к ним дополнительную функциональность.

У этой библиотеки весьма лаконичная документация, но код говорит сам за себя. Лучший способ разобраться в библиотеке — это посмотреть пример приложения и увидеть в нём реализацию Activities и Fragments .

Библиотека выпущена под лицензией Apache 2.0, и на неё действительно стоит обратить внимание.

2. Creative View Pager

Creative View Pager — это интересная реализация ViewPager , в который добавляется список заголовков, плавно прокручивающийся вместе с содержимым страниц.

Документация исчерпывающая и объясняет, как использовать библиотеку. Выпущена под лицензией Apache 2.0 и написана практически полностью на Kotlin.

3. Instabug

Instabug — это инструмент сбора отзывов и ошибок для мобильных приложений. Благодаря нескольким простым действиям ваши пользователи или бета-тестировщики смогут сообщать об ошибках или оставлять отзывы, а SDK будет запоминать состояние среды устройства пользователя, включая все консольные логи, сетевые запросы и шаги для воспроизведения ошибки, собирая всю эту информацию на одной панели для удобства отладки и исправления ошибок.

В ходе недавнего обновления было исправлено множество ошибок. Подробнее об этих изменениях вы можете почитать здесь. Таким образом, Instabug даёт возможность:

  • сообщать об ошибках и сбоях;
  • проводить опросы прямо в приложениях;
  • запрашивать функциональность, которую хотелось бы видеть в приложении;
  • контролировать производительность сети;
  • включать автозапись экрана.

Я использую Instabug с 2016 года, когда я искал инструмент, который помог бы моей команде и нашим пользователям. Настоятельно рекомендую его и вам.

4. CheckableChipView

Это check-виджет для Android на основе EventFilterView из приложения, написанного специально для Google I/O 2018. Для него требуется minSdkVersion 21.

Хороший README позволяет быстро начать работать с виджетом. Первоначальную реализацию разработали Ник Батчер и Хосе Алькеррека из Google.

Виджет выпущен под лицензией Apache 2.0 и написан на Kotlin.

5. CrunchyCalendar

Это лёгкий, мощный и простой в использовании календарь.

CrunchyCalendar

Он предлагает ряд полезных функций:

  • бесконечная вертикальная прокрутка в обоих направлениях;
  • установка временных рамок для ограничения прокрутки внутри определенного периода;
  • выбор одной даты, нескольких дат или временных диапазонов;
  • предустановка выбранных дат;
  • цветовые настройки;
  • отображение цветовых индикаторов;
  • установка собственных ItemDecoration ;
  • являясь наследником класса View , может быть использован где угодно: в Activity , Fragment , Dialog , или может быть интегрирован в другой пользовательский View -компонент.
Читайте также:
Что за программа ponyprog

Замечательная документация с множеством примеров. Также есть пример приложения на Github и Google Play.

Этот проект выпущен под лицензией MIT.

6. InboxRecyclerView

Это библиотека для создания динамической навигации в приложении, вдохновлённая Google Inbox и Reply.

InboxRecyclerView можно спокойно добавить в любой существующий проект. Можете взглянуть на пример приложения и загрузить его APK, чтобы посмотреть на своём телефоне.

Автор также написал действительно хорошую статью о библиотеке. Она определённо достойна вашего внимания. Выпущена под лицензией Apache 2.0.

7. SlideBack

Это небольшая, но интересная библиотека, которая предлагает вам использовать SlideBackView внутри Activity . Чтобы понять, что это вообще такое, взгляните на gif ниже.

К сожалению, документация довольно скудная и написана на китайском языке. Я бы не использовал её в своём проекте, а только лишь поэкспериментировал с ней. Тем не менее, вы можете изучить приложение и саму библиотеку. Она выпущена под лицензией MIT.

8. DrawableToolbox

Эта библиотека создаёт drawables программно и избавляет от повторяющихся файлов drawable.xml .

Выпущена под лицензией Apache 2.0. Есть полноценная документация и работает с API 14 и выше.

9. ColorPicker

Это библиотека написана тем же разработчиком, который написал DrawableToolbox. Это просто ещё один виджет для выбора цвета.

Эта библиотека предоставляет неплохую документацию. Выпущена под лицензией Apache 2.0 и работает с API 14 и выше. Если вам нужна функциональность выбора цвета в вашем приложении, то это отличный вариант.

10. MvRx

Библиотека просто огромна. MvRx (произносится «мэйврикс» (англ. mavericks)) — это Android-фреймворк от Airbnb, который они используют практически для всех своих продуктов.

MvRx делает разработку экранов приложения, от самых простых до более сложных, более простой, чем она есть изначально. Тем не менее, в ней всё построено поверх существующих компонентов, таких как фрагменты или архитектурные компоненты, поэтому она не ограничивает вас и может легко применяться в ваших проектах.

Основная цель заключалась в том, чтобы создавать приложения быстрее и с меньшими усилиями. MvRx использует следующие технологии и концепции:

  • Kotlin;
  • Архитектурные компоненты Android;
  • RxJava;
  • React (концепция);
  • Epoxy (рекомендуется).

Фреймворк выпущен под лицензией Apache 2.0. Документация и wiki просто великолепны. В wiki есть версия tl;dr , а есть и обычная, со всеми объяснениями, необходимым для понимания концепции.

11. RxRedux

Если вы слышали о Redux, его основных концепциях и трех принципах, вы, вероятно, сразу поймёте, о чём эта библиотека.

RxRedux — это реализация, основанная на RxJava (вдохновленная redux-observable), которая помогает нейтрализовать побочные эффекты (побочный эффект — это функция типа (Observable , StateAccessor ) -> Observable ).

RxRedux

RxRedux является некой заменой оператора .scan() в RxJava. README написан хорошо и отлично дополнен этой статьей. Библиотека выпущена под лицензией Apache 2.0.

12. Emoji Slider

Это кастомный SeekBar , вдохновленный эмоджи-слайдером от Instagram.

В проекте есть очень хорошая документация и пример приложения. Выпущен под лицензией Apache 2.0.

13. Covert

Это библиотека, которая помогает реализовывать Material Swipe Actions в RecyclerView. Естественно, она написана в соответствии с принципами Material Design.

Благодаря хорошей документации её легко насторить. Проект выпущен под лицензией MIT.

14. PixelShot

Это библиотека, которая может сохранять любой View -компонент или SurfaceView в виде изображения в форматах: JPG/PNG/nomedia . Библиотека работает в фоновом потоке, обрабатывая ошибки ввода-вывода и управляя распределением памяти.

Вы можете использовать её, чтобы делать скриншоты внутри вашего приложения (например, для сообщения об ошибке).

Она довольно проста в использовании, а существующей документации вполне достаточно для начала. Она выпущена под лицензией Apache 2.0 и поддерживает API 19 и выше.

15. WiseFy

WiseFy — это оболочка для WifiManager и ConnectivityManager для Android. Она добавляет лёгкие высокоуровневые настройки, например:

  • добавление и удаление сетей;
  • проверка подключения устройства;
  • проверка текущей сети;
  • включение и выключение Wi-Fi и многое другое.

WiseFy

Это не новая библиотека, но недавно в ней произошёл огромный рефакторинг, и она была полностью переписана на Kotlin.

Документация хорошая и подробная. Лицензия: Apache 2.0.

16. MVICore

MVICore — это современный MVI-фреймворк от Badoo Tech, который включает в себя:

  • 100% Kotlin: простой способ реализовывать свои бизнес-функции в реактивном режиме;
  • Масштабирование: вы можете работать с единственным Reducer-компонентом, но при необходимости сможете добавить их столько, сколько нужно для обработки более сложных случаев;
  • Обработка событий: есть решение для обработки событий, состояние которые вы не хотите хранить;
  • Связывание реактивных компонентов: очень простой API для связки ваших реактивных компонентов вместе с автоматическим управлением жизненным циклом;
  • Логгер из коробки;
  • Временной отладчик: для всех ваших реактивных компонентов (а не только для переменных среды) вы сможете записать их состояние во времени и затем просмотреть его.

У фреймворка действительно хорошая документация. Если вы хотите переписать свое приложение в стиле MVI, то вам стоит обратить внимание на это решение.

17. DialerLoading

Эта библиотека может быть полезна при разработке собственных View -компонентов. Например, такой вот крутящийся телефонный диск может использоваться в качестве замены индикатора загрузки.

В проекте есть короткий README. А выпущен он под лицензией Apache 2.0. Написан полностью на Kotlin.

18. HtmlRecycler

Это интересная библиотека, которая преобразует простую HTML-страницу в RecyclerView из нативных Android-виджетов, основанная на Jsoup library и вдохновленная Medium Textview.

Эта библиотека ещё находится на стадии разработки, поэтому с осторожностью используйте её в своих проектах. Документация хорошая и доступно объясняет, как использовать библиотеку. Выпущена под лицензией Apache 2.0.

19. Android Clean Architecture Components Boilerplate

Я неоднократно упоминал об этой библиотеке, но благодаря усилиям команды Buffer она всё ещё развивается. В настоящее время они показывают, как использовать Koin вместо Dagger для инжекции зависимостей.

Android Clean Architecture Components Boilerplate

Библиотека выпускается под лицензией MIT.

20. Splitties

Splitties — это коллекция небольших независимых Android-библиотек, цель которых — сделать разработку приложений и библиотек для Android простой и весёлой. Мне очень нравится эта идея.

Этот проект называется «Splitties», потому что он разделён на небольшие модули, распространяемые как независимые Android-библиотеки, поэтому вы можете добавлять к себе в проект только те, которые действительно нужны, что помогает уменьшить размер финального apk-файла.

Каждый модуль спроектирован так, чтобы при своём небольшом размере он был максимально эффективным.

Читайте также:
Программа 1с ерп что это такое

Документация хорошая, проект выпущен под лицензией Apache 2.0.

21. AndroidWM

Это небольшая библиотека для водяных знаков на изображениях, которая в том числе поддерживает зашифрованные и невидимые водяные знаки.

AndroidWM

Библиотека довольно мощная и предлагает создавать несколько водяных знаков, выбирать режим рисования и способ загрузки ресурсов (как текст, как View -компонент или как Android-ресурс). Документация хорошая, ещё есть пример приложения.

Библиотека выпущена под лицензией Apache 2.0.

22. Android components

Это вторая коллекция библиотек в этой статье. На этот раз от команды Mozilla, и она может быть полезна во время создания браузеров или приложений, похожих на браузер.

На приведенной ниже диаграмме показаны некоторые из доступных компонентов.

Android components

В проекте есть 4 примера приложений, демонстрирующих использование различных компонентов. В нём также хорошая документация, и выпущен он под лицензией MPL 2.0.

23. RxBiometric

Эта библиотека связывает RxJava и RxKotlin с Biometric Prompt (сканер отпечатков пальцев) на Android (добавлен в Android 9 Pie, API 28+).

RxBiometric

Согласно официальному блогу Android-разработчиков, если в вашем приложении вы используете собственные механизмы авторизации через отпечатки пальцев, то вы должны как можно скорее переключиться на использование BiometricPrompt API.

RxBiometric поможет вам сделать это через поток RxJava. В ней есть надежная документация с примерами использования. Выпущена под лицензией Apache 2.0.

24. EnhancedNavigationView

Это библиотека, которая расширяет BottomNavigationView от Google и позволяет взглянуть на него под весьма интересным углом.

Проект написан на Kotlin. Выпущен под лицензией Apache 2.0, и в нём есть пример приложения с использованием библиотеки.

25. livedata-ktx

Это расширение LiveData на Kotlin, превращающее код в цепочки вызовов, как RxJava, от команды Shopify. Если вы используете LiveData из архитектурных компонентов Android, то вы легко можете заменить его на LiveData KTX и создавать такие цепочки, как показано на примере ниже:

livedata-ktx

Проект разрабатывается четырьмя разработчиками и выпущен под лицензией MIT.

26. Tumbleweed

Tumbleweed — это ответвление от Universal-Tween-Engine, которое позволяет создавать плавные интерполяции для каждого атрибута каждого объекта в ваших проектах.

Tumbleweed отличается от исходного проекта несколькими особенностями:

  • уменьшено изменение Tweens и Timelines (разделено объявление и реализация Tweens );
  • интерполяция инкапсулирована путём создания определённого типа ( TweenType );
  • удалён пул (постоянный источник неожиданного поведения) и многое другое.

Содержит исчерпывающую документацию и выпущена под лицензией Apache 2.0. В ней также есть пример приложения.

27. Stylist

Stylist — это проект, созданный разработчиками Uber. Это Gradle-плагин, написанный на Kotlin, который генерирует базовый набор Android-тем. Например, если вы хотите определить размер текста в тёмной и светлой темах приложения, вы создадите следующий класс:

Dark and Light themes with Stylist

И вы получите сгенерированные XML-темы:

XML-theme with Stylist

Проект выпущен под лицензией Apache 2.0.

28. RxkPrefs

Это небольшая библиотека, которая предоставляет реактивные shared preferences. Она разработана специально для использования вместе с Kotlin.

Используя экземпляр RxkPrefs , вы можете получить preferences. Но это будет не сырое значение preference, а экземпляр интерфейса Pref , который предоставляет больше функциональности.

Библиотека выпущена под лицензией Apache 2.0.

29. Philology

Эта библиотека предлагает простой способ динамической замены строковых ресурсов вашего приложения или добавления новых языков без необходимости публикации новой версии в Google Play. Как это работает?

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

Это действительно хорошая идея. Библиотека выпущенна под лицензией Apache 2.0. Проект содержит пример приложения, а также действительно полную документацию.

30. Scarlet

Это вдохновлённый Retrofit WebSocket -клиент для Kotlin и Java от команды Tinder. Библиотека хорошо задокументирована и описана в этой статье.

Вы также можете посмотреть её использование в приложении для проверки курса Биткойна в реальном времени.

Scarlet управляется при помощи StateMachine, также разработанной командой Tinder.

Scarlet

Проект выпущен под лицензией BSD 3-Clause.

Заключение

Вот и всё! Надеюсь, вам понравился этот список, и некоторые проекты вдохновили вас. Если вы знаете ещё какую-нибудь большую библиотеку, которая была выпущена за последние 5 месяцев, и я не упоминул об этом, пожалуйста, дайте мне знать в комментариях.

  • Программирование
  • Разработка мобильных приложений
  • Разработка под Android
  • Kotlin

Источник: habr.com

Учимся работать с Android NDK или как использовать C код в java проектах

Android NDK native

Android NDK представляет собой набор утилит, позволяющих Вам включать код, написанный на C и C++, в ваше приложение. Такой код называется нативным(native), поскольку он не может быть выполнен на виртуальной машине и компилируется непосредственно в машинный код требуемой процессорной архитектуры.

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

  1. Вы умеете программировать на Java и C
  2. Вы умеете работать с командной строкой
  3. Вы знаете, как узнать версии Cygwin, awk и других инструментов, которыми нам придется пользоваться
  4. Вы умеете разрабатывать приложения для Android
  5. У Вас настроена среда разработки для Android (в момент написания автор использовал Android 2.2)
  6. Вы используете Eclipse или можете транслировать инструкции по работе с eclipse на свою IDE.

Если какой-либо из указанных пунктов вызывает у вас затруднения, не беда, вы все равно вполне можете усвоить предлагаемый материал, правда некоторые шаги будут казаться Вам довольно сложными. Вообще вопрос использование Android NDK часто вызывает затруднения даже у матерых разработчиков. Скорей всего вам придется приложить значительные усилия, прежде чем вы сможете настроить свою среду разработки и написать работающий проект.

Когда нужно использовать Android NDK?

Обычно разработчики решают использовать нативный код в двух случаях: они хотят увеличить производительность своего приложения, или у них есть готовый C/C++ проект, который требуется с минимальными затратами портировать на Android. Давайте не будем спешить и разберемся, когда же целесообразно использовать NDK, а когда этого не нужно делать.

Наиболее часто программистами высказывается мнение, что NDK стоит использовать, когда приложение сильно нагружает процессор. Существуют алгоритмы, позволяющие полностью загрузить процессор через DalvikVM, в этом случае использование нативного кода действительно с большой вероятностью позволит получить выигрыш в производительности.

Однако, не нужно забывать, что использование JIT компилятора также позволяет повысить производительность java кода. Многие думают, что использование в приложении машинного кода автоматически означает увеличение скорости работы приложения. На самом деле это не так. Переключение с выполнения java кода на машинный код и обратно несет с собой накладные расходы, поэтому использовать NDK стоит, только если у вас выполняется какой-нибудь долгий сложный расчет, полностью написанный на C, и в java коде не предполагается частое дерганье нативных функций.

Читайте также:
Программа zoom что это такое отзывы

Другой причиной, которая может побудить Вас использовать NDK является необходимость портирования готового приложения. Вполне логично не переписывать уже проверенные и отлаженные куски кода на java, а использовать NDK. Этот подход также позволит Вам в дальнейшем без особых затрат вносить параллельно правки в исходное и портированное на android приложение. В частности, такой подход оправдан в отношении приложений, использующих OpenGL ES.

Шаг 1: Установка Android NDK и настройка среды разработки

Прежде всего, Вам необходимо скачатьAndroid NDK. Для установки и нормальной работы нам также понадобятся утилиты Cygwin 1.7 или старше, awk последней версии, а также GNU Make 3.81 или старше.

После того, как Вы скачали архив с NDK, распакуйте его в какую-нибудь папку. Можно распаковать этот архив туда же, где лежит Android SDK. Путь к этой папке необходимо прописать в системной переменной PATH. В Windows для этих целей лучше настроить конфигурацию Cygwin.

Шаг 2: Создание нового проекта

Создайте новый Android проект. Чтобы избежать проблем в будущем сохраните проект так, чтобы путь к нему не содержал в себе символов пробела. Для примера создайте проект, в качестве названия пакета укажите «com.mamlambo.sample.ndk1», а в качестве Activity — «AndroidNDK1SampleActivity».

В корне проекта создайте папку с названием «jni». Именно здесь будет содержаться файлы с нативным кодом. Если Вы знакомы с JNI, то вам будет приятно узнать, что Android NDK по сути представляет собой JNI с ограниченным набором заголовочных файлов для компиляции C кода.

Шаг 3: Добавляем C код в Android проект

Создайте в папке jni файл с именем native.c и добавьте в него следующий код

#include #include #include #define DEBUG_TAG «NDK_AndroidNDK1SampleActivity» void Java_com_mamlambo_sample_ndk1_AndroidNDK1SampleActivity_helloLog(JNIEnv* env, jobject this, jstring logThis) { jboolean isCopy; const char* szLogThis=(*env)->GetStringUTFChars(env, logThis,isCopy); __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG,»NDK:LC: [%s]», szLogThis); (*env)->ReleaseStringUTFChars(env, logThis, szLogThis); }

Созданная таким образом функция берет параметр String у java объекта, конвертирует его в C-string и записывает в LogCat. Зубодробительное имя функции выбрано не случайно, оно несет в себе важную информацию: сначала указывается название паттерна («Java»), затем идут название пакета, имя класса и название метода. Каждая часть имени отделяется знаком подчеркивания.

Первые два параметра у функции имеют особое значение. Первый параметр определяет JNI среду и часто используется со вспомогательными функциями. Второй параметр является объектом Java, частью которого является функция.

Шаг 4: Вызов нативного кода из Java

Давайте создадим в нашем проекте кнопку, при нажатии на которую будем вызывать следующий код:

helloLog(«This will log to LogCat via the native call.»);

Необходимо также объявить функцию helloLog в классе, где она вызывается. Сделать можно с помощью строки

private native void helloLog(String logThis);

Таким образом, мы сообщаем компилятору и линковщику, что реализацию этой функции стоит искать в папке с нативным кодом.

Наконец, нужно загрузить библиотеку, куда в конечном счете будет скомпилирован код. Добавьте следующую инициализацию в класс Activity.

static{ System.loadLibrary(«ndk1»); }

System.loadLibrary() обеспечивает загрузку библиотеки по имени. Вы можете использовать любое название.

Шаг 5: Создаем Make file для нативного кода

Для компиляции нативного кода в папке jni должен находиться Make file с именем «Android.mk». Ниже приведен код этого фала для нашего примера, то есть когда функция находится в файле native.c и в качестве имени библиотеки указано ndk1

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_LDLIBS := -llog

LOCAL_MODULE := ndk1
LOCAL_SRC_FILES := native.c

include $(BUILD_SHARED_LIBRARY)

Шаг 6: компиляция нативного кода

После того, как Вы написали код и добавили make файл в папку jni можно приступать к компиляции. Для этого нужно в командной строке (Если вы работаете в windows, запустите Cygwin) запустить ndk-build из папки проекта. Утилита ndk-build входит в состав Android NDK. Если Вы все сделали правильно, то вы должны увидеть что-то вроде этого

NDK компиляция

Шаг 7: Запуск приложения

Теперь можно запустить проект, нажать на кнопку и посмотреть, как изменится LogCat.

Может произойти одна из двух вещей: 1) ваш проект может запуститься и работать, как Вы того ожидаете. В этом случае примите мои поздравления. 2) Возникнет ошибка, которая в LogCat отобразиться как «Could not execute method of activity.» Ничего страшного. Обычно Eclipse сконфигурирован так, что при запуске проекта автоматически происходит его перекомпиляция.

В случае, если эта опция отключена, то нужно вручную заставить Eclips перекомпилировать проект. Для этого перед запуском нужно вызвать менюProject->Clean from the Eclipse toolbar.

Шаг 8: Как вернуть объект из нативной функции

Следующий пример демонстрирует возможность нативных функций возвращать объекты, например String. Добавьте код в файл native.c

jstring Java_com_mamlambo_sample_ndk1_AndroidNDK1SampleActivity_getString(JNIEnv* env, jobject this, jint value1, jint value2) { char*szFormat=»The sum of the two numbers is: %i»; char*szResult; // добавляем две переменные jlong sum= value1+value2; // malloc для строки результата szResult= malloc(sizeof(szFormat)+20); // standard sprintf sprintf(szResult, szFormat, sum); // получаем объект string jstring result=(*env)->NewStringUTF(env, szResult); // очищаем память free(szResult); return result; }

С помощью команды malloc мы создали буфер, куда затем с помощью sprintf поместили строку. Чтобы функция возвращала корректный результат, мы использовали JNI helper функцию NewStringUTF(), которая фактически создает Java объект на основании C строки. После этого мы очистили память с помощью команды free().

Для успешной компиляции проекта необходимо в native.c подключить заголовочный файл stdio.h. В классе Activity нужно также объявить новую функцию:

private native String getString(int value1, int value2);

после этого с функцией getString можно работать, например следующим образом:

String result= getString(5,2); Log.v(DEBUG_TAG,»Result: «+result); result= getString(105,1232); Log.

v(DEBUG_TAG,»Result2: «+result);

Замечания

Android NDK для своей работы требует Android SDK 1.5. С помощью NDK можно получить доступ ко многим API, например к OpenGL ES.

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

Заключение

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

Авторы:Lauren Darcey и Shane Conder
Источник:Advanced Android: Getting Started with the NDK
Перевод:Александр Ледков

Источник: www.mobilab.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru