Pull to refresh

Как я боролся с Android NDK и NetBeans 6.8

Reading time3 min
Views7.2K
image
В этом посте я хочу немного поделиться сыном ошибок трудных — опытом. По другому и не скажешь, потому что некоторые ошибки компиляции, сборки и т.п. съели очень много времени. Я не всякий раз докапывался до причин, хотелось побыстрее получить работающую математику. Но так или иначе мне удавалось находить или вычитывать правильное решение. Поэтому я просто хочу обратить внимание тех, кто будет идти тем же путем, на некоторые нюансы. Возможно это сэкономит вам какое-то время. В конце я приведу пример приложения, ради которого это все было нужно. Картинка из заголовка — это скрин приложения.
И так, задача у меня была следующая. Я написал приложение под андроид, которое оказалось очень требовательным к ресурсам. На «математику» (я имею в виду работу с контейнерами, вычисления и т.п.) уходило очень много времени. Для сравнения, консольное приложение на чистом С++, считало задачу в пределах 3 секунд. Тогда как Android-приложение на java, запущенное на эмуляторе, то же самое считало 2.5 минуты. Поэтому я решил алгоритмическую часть вынести на C++. Также хочу отметить что мне совсем не хотелось ставить Eclipse поэтому я боролся в том что было — NetBeans 6.8. Так что предположим, что у вас уже стоит SDK, NDK и NetBeans и пойдем дальше.

Проблема 1

В примерах из архива NDK исходники представлены в «С». Если вы хотите использовать «С++» и будете писать свой код в *.cpp / *.h – не забудьте заменить вызовы функций объекта JNIEnv вида (*env)->GetIntArrayElements(pixels, 0) на env->GetIntArrayElements(pixels, 0)

Проблема 2

Компилирование C++ кода в *.so. Я для этих нужд поставил Cygwin. Не забудьте при его установке выбрать среди предложенных пакетов — make, по-умолчанию оно не ставится. Чтобы не копипастить конфигурирование Cygwin и указания, куда складывать свой C++ код — просто приведу ссылку. Там достаточно подробно все описано и главное — все в одном месте, что не маловажно.

Проблема 3

Компиляция и запуск apk на эмуляторе. Похоже у NetBeans 6.8 серьезные проблемы с развертыванием и запуском приложений с so-библиотеками на эмуляторе. Мне помогла только ручная сборка (ручной запуск компиляции ant) и ручная загрузка приложения на эмулятор. Стоит отметить, что после того как скомпилированное таким образом приложение загружено на эмулятор, при отсутствии необходимости менять (перекомпилировать и заново выкладывать) so-библиотеку NetBeans нормально компилит основную часть apk, выкладывает на эмулятор и запускает как в debug так и в release режимах. Поэтому получается напряжная ситуация. Приходится отдельно (с большим количеством телодвижений) отлаживать и выкладывать нативную часть, а затем уже в обычном режиме отлаживать java-часть (интерфейсную).
Последовательность команд при компиляции через ant такая:
1. «android update project --target --path path/to/your/project/»
2. «ant debug» или «ant release»
3. После этого в папке bin проекта будут сборки приложений и можно запускать загрузку приложения на эмулятор «adb -e install bin/Application.apk». Эмулятор к этому времени должен быть запущен.

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

UPD: Производительность приложения с нативным кодом повысилась в 10 раз. Если путем экспериментов с разными контейнерами расчет тестовой задачи на java-коде удалось сократить до ~100с, то она же с использованием нативного кода с STL считается ~7с.

Приложение

Ну и в завершение пару слов о приложении, ради которого это все было необходимо.
Это небольшая рисовалка по Android PaintUp, которая умеет строить сложные градиентные заливки. Еще в университете для схожей задачи мы придумали один шустренький алгоритм, который как оказалось достаточно умело справляется с цветовыми градиентами. И стало интересно реализовать его на мобильной платформе.
В итоге получилась рисовалка, которая по нескольким цветным штрихам может сделать симпатичную и далеко не всегда предсказуемую картинку.
Описание приложения на андроид-маркете здесь, ниже несколько примеров (некоторые с исходниками) и qr-code на установку.

image
image
image
image
image
image image

qrcode
Tags:
Hubs:
Total votes 44: ↑40 and ↓4+36
Comments13

Articles