Любой простой способ войти в код Android NDK?
Я ищу способ легко отладить код C в приложении Android NDK с помощью Eclipse. Я читал способы отладки приложения с помощью gdb или чего-то подобного, но то, что я хочу, это способ как-то выталкивать сообщения в Eclipse.
Я ищу решение, которое так же просто, как использование функции печати в C и просмотр ее в журнале DDMS или что-то подобное. Кто-нибудь имеет опыт в этом?
Ответы
Ответ 1
Вы можете использовать средства ведения журнала Android:
#include <android/log.h>
#define APPNAME "MyApp"
__android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "The value of 1 + 1 is %d", 1+1);
Убедитесь, что вы также связываетесь с библиотекой протоколирования в вашем файле Android.mk:
LOCAL_LDLIBS := -llog
Ответ 2
Самый простой способ - это, вероятно, перенаправление операторов printf() в системный журнал (в разделе "Просмотр stdout и stderr" в официальном справочном руководстве ADB.
Введите эти 3 команды в командной строке:
adb shell stop
adb shell setprop log.redirect-stdio true
adb shell start
Затем вы можете просмотреть вывод своих операторов printf(), просмотрев окно "LogCat" отладчика Eclipse или введя его в командной строке:
adb logcat
Просто имейте в виду, что, поскольку данные буферизуются перед передачей из эмулятора или устройства, вы должны обязательно сбросить буфер stdout, например:
printf("Hello, I am %d years old!\n", 30);
fflush(stdout);
Затем вы должны увидеть сообщение журнала, начинающееся с "I/stdout:"
Ответ 3
Альтернативное решение (с использованием отладчика) объясняется здесь:
Как я могу эффективно отлаживать код C, который обернут JNI в Eclipse? (Android Dev)
Ответ 4
ADT 20 включает плагин NDK, который обеспечивает поддержку для создания и отладки проектов NDK в Eclipse. В этом документе описывается, как установить и использовать плагин NDK. Инструкции довольно просты и состоят всего из нескольких шагов.
Это самое простое решение, которое я нашел, и это сработало для меня.
Примечание. Если вы используете пакет ADT, вам нужно только установить инструменты разработки C с установкой нового программного обеспечения (см. скриншот), и вы можете сразу перейти к разделу "Использование плагина NDK".
![c dev tools install]()
Изменить: Кажется, что проблема с CDT в eclipse juno http://code.google.com/p/android/issues/detail?id=33788 заставляет отладчик eclipse не можете найти точки останова.
Обходной путь, который я использовал, заключается в том, чтобы запустить приложение в режиме отладки (не отлаживать как собственное приложение, а "регулярное" отладка), а затем в командной строке я пошел в свой проект и набрал ndk-gdb
(это создает файл gdb.setup
в папке obj/local/armeabi
). После этого контрольные точки работали как обычно.
В комментариях, связанных с вопросом о ссылке выше, они предлагают некоторые другие обходные пути, но я не пробовал их, поскольку они, казалось, требовали больше усилий, чем это.
Ответ 5
Никто не опубликовал информацию о различных уровнях журнала до сих пор. Ответ - попытка сделать "картинку" логирования полной.
#include <android/log.h>
#define TAG "MY_TAG"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
Использование:
char err[] = "wrong";
LOGE("Something went %s", err);
Связать библиотеку журналов Android, как показано ниже.
Android.mk:
LOCAL_LDLIBS := -llog
CMakeLists.txt:
find_library( log-lib log )
target_link_libraries( ${log-lib} )
Дальнейшее чтение: регистрация
Ответ 6
Вы также можете немного утилизировать
#include <android/log.h>
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "native-lib", __VA_ARGS__))
Использование:
std::string hello = "Hello from C++";
int a = 1;
LOGI("int %d, string: %s", a, hello.c_str());