Я переношу сложное приложение C на Android в виде библиотеки SO, обернутой тонким слоем java. После нескольких часов хлопот у меня компилируется код под Android, но, конечно же, приложение вылетает :(
Посмотрев вокруг, я понял, что единственный способ отлаживать приложение C под Android - это gdb. Поскольку у меня нет большого опыта работы с gdb, кто-нибудь может поделиться некоторыми соображениями?
У кого-нибудь есть учебник по gdb под окнами :)?
Спасибо
Ответ 1 · рейтинг 8 · Yenchi
для более поздней версии NDK (я использую r7c) вы можете собрать отладочную версию с помощью
- добавить флаг
android:debuggable="true" к тегу <Application> в AndroidManifest.xml
- вызывать
ndk-build с NDK_DEBUG=1 (флаг NDK_DEBUG не требуется, если ndk-build запущен с оболочкой unix)
в Windows все становится немного сложнее, потому что для использования ndk-gdb вам все еще нужен bash (или cygwin) с NDK r7c, но ndk-build, работающий в cygwin bash, столкнется с проблемой разрешения, если вы когда-либо используете любую из предварительно созданных статических библиотек
мое решение на Windows-машине
- добавить флаг
android:debuggable="true" к тегу <application в AndroidManifest.xml (как указано выше)
- в cmd (командная строка Windows): вызовите
ndk-build с NDK_DEBUG=1
- в cygwin bash: запустите
ndk-gdb
для быстрого начального исследования родной библиотеки so создайте простое действие с одной кнопкой для запуска функции входа в библиотеку и loadLibrary в действии, например:
class MyActivity extends Activity {
static {
System.loadLibrary("mylibrary");
}
/* other functions like onCreate, etc... */
public native void libfunc();
public void onClick(View v){
libfunc();
}
}
Таким образом, когда gdb запускается, рассматриваемая библиотека фактически загружается, но у вас еще есть время установить точки останова и т. д., прежде чем программа вылетит; когда вы закончите настройку отладчика, в приглашении (gdb) введите continue (или просто 'c'), затем нажмите кнопку, чтобы запустить аварийную программу и удачной отладки...