среда, 29 мая 2013 г.

Подключение и отладка Native библиотеки к MonoAndroid проекту.

Подготовка

добавьте пути к cygwin, инструментам android-sdk и android-ndk в PATH. C:\cygwin\bin;c:\AndroidDev\android-ndk-r6-crystax-2;C:\AndroidDev\android-sdk;C:\AndroidDev\android-sdk\tools;C:\AndroidDev\android-sdk\platform-tools</li>
установить значение переменной ANDROID_NDK_ROOT=/cygdrive/c/AndroidDev/android-ndk-r6-crystax-2

 В некоторых старых версиях android-ndk (r6 в частности) также рекомендовалось отредактировать файл build/core/build-binary.mk, а именно: закомментировать строчку: $(hide) $(call cmd-strip, $(PRIVATE_DST))

Создадим новый проект



Создадим в каталоге проекта файлы для построения Navite библиотеки




Создадим новый класс для вызова native методов из mono части



Из Cygwin построим native библиотеку с ключом NDK_DEBUG=1
добавим построенные библиотеки к проекту



поменяем в свойствах у них Build Action и Copy to Output Directory

сохраним и закроем visual studio и добавим в проектном файле в секцию native библиотек строчку <Abi> armeabi</Abi>

добавим вызов сишного кода в mono проект

добавим postbuild action


Нажмите Run и запустите программу на устройстве или симуляторе.
Перейдем в cygwin в c:\projects\SampleGdb\obj\Debug\android\libs\armeabi\ и запустим ndk-gdb
 для проверки вызовем i func если все правильно, то на экране будет примерно такая картинка:
наслаждаемся отладкой в gdb


вторник, 28 мая 2013 г.

Отладка android ndk библиотек в MonoAndroid проекте.


Введение

Допустим, вы пишите с использованием mono android в Visual Studio. И у вас в проекте используются сишные native библиотеки. Допустим, библиотеки уже подключены и надо заняться их отладкой. Пишу способ подключение gdb (точнее скрипта ndk-gdb, который вызывает gdb). Может возникнуть вопрос, а почему не использовать  visualGDB и winGDB для отладки? Ответ прост - в моем проекте используется библиотека, построенная android-NDK-r6-crystax-2, а visualGDB и winGDB с этим NDK работать вообще не хотят. Ну ещё причина - ради развлечения для людей, которые никогда не работали с gdb. Плюс это бесплатно.

Step-by-step

Условие номер ноль - строим native библиотеку при помощи ndk-build из консоли cygwin. Если нет, то могут быть какие-то проблемы, т.к. ndk-gdb будет плохо работать. Я с этим не сталкивался, но возможно это так. =)
  1. добавьте пути к cygwin, инструментам android-sdk и android-ndk в PATH. C:\cygwin\bin;c:\AndroidDev\android-ndk-r6-crystax-2;C:\AndroidDev\android-sdk;C:\AndroidDev\android-sdk\tools;C:\AndroidDev\android-sdk\platform-tools
  2. установить значение переменной ANDROID_NDK_ROOT=/cygdrive/c/AndroidDev/android-ndk-r6-crystax-2
  3. Mono создает временный java проект, который потом собирается. Вот его то и будет отлаживать. Проект этот лежит в project_path\obj\Debug\android\ убедитесь, что в манифесте установлен параметр debuggable=«true». Для отладочного режима построения он включен по умолчанию. Если нет, то посмотрите в свойствах проекта.
  4. В Application.mk допишите следующую строку: APP_OPTIM:=debug. Этот параметр, если я не ошибаюсь, отменяет stripping (удаление неиспользуемых символов) при копировании библиотек, и делает еще какие-то другие полезные для отладки вещи. В Android.mk в LOCAL_CFLAGS следует добавить параметры -g -ggdb -O0, а из параметров LOCAL_LDLIBS следует убрать -s и -S (если есть).
  5. После этого запускаем Cygwin, отправляется в каталог с проектом и запускаем cборку с ключом NDK_DEBUG=1: ndk-build NDK_DEBUG=1 Если все сделано правильно, то в каталоге проекта в подкаталоге libs/<платформа>/ появятся файлы gdb.setup и gdbserver.
  6. добавить gdbserver в проект. Выставить в свойствах, что это AndroidNativeLibrary и всегда копировать в директорию. Не забыть добавить armeabi в AndroidNativeLibrary секцию в файл проекта (в .csproj файл) armeabi Always
  7. Т.к. ndk-gdb ищет *.mk файлы в директории проекта , то я добавил post-build event для копирования файлов во временный каталог obj: cp -r library_path\jni project_path\obj\Debug\android\ cp -r library_path\libs project_path\obj\Debug\android\
Ну и последнее - перейти в project_path\obj\Debug\android\libs\armeabi\ и запустить ndk-gdb.

Ссылки

Неплохая документация есть в самом androidSDK и androidNDK 
PS:Пишу для себя, чтобы не забыть.