Любой простой способ войти в код Android NDK? - PullRequest
64 голосов
/ 07 января 2011

Я ищу способ легкой отладки кода C в приложении Android NDK с помощью Eclipse.Я читал способы отладки приложения с помощью gdb или чего-то подобного, но мне нужен способ как-то передавать сообщения в Eclipse.

Я ищу решение, столь же простое, как использование функции печати вС и увидев это в журнале DDMS или что-нибудь подобное.У кого-нибудь есть такой опыт?

Ответы [ 6 ]

116 голосов
/ 07 января 2011

Вы можете использовать средства регистрации 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
12 голосов
/ 11 августа 2011

Возможно, самый простой способ - перенаправить операторы printf () в системный журнал (на основе раздела «Просмотр stdout и stderr» официального справочного руководства АБР .

. Введите эти3 команды в командной строке:

adb shell stop
adb shell setprop log.redirect-stdio true
adb shell start

Затем вы можете просмотреть вывод ваших операторов "printf ()", посмотрев в окно "LogCat" Eclipse Debugger, или набрав его в командной строке.:

adb logcat

Просто имейте в виду, что, поскольку данные буферизуются перед передачей с эмулятора или устройства, вы должны обязательно очистить буфер stdout, например:

printf("Hello, I am %d years old!\n", 30);
fflush(stdout);

Затем вы должны увидетьсообщение журнала, начинающееся с "I / stdout:"

5 голосов
/ 10 ноября 2018

Никто еще не опубликовал информацию о различных уровнях журнала.Ответ - попытка сделать «картинку» журналирования полной .

#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} )

Дополнительное чтение: Вход

2 голосов
/ 05 ноября 2018

Вы также можете немного использовать

#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());
2 голосов
/ 03 мая 2013

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).После этого точки останова работали как обычно.

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

2 голосов
/ 09 февраля 2011

Альтернативное решение (с использованием отладчика) поясняется здесь:

Как эффективно отладить код C, заключенный в JNI в Eclipse?(Android Dev)

...