Как получить сообщения "printf", написанные в приложении NDK?
если я определяю такую функцию в файле java
/**
* Adds two integers, returning their sum
*/
public native int add( int v1, int v2 );
поэтому мне нужно закодировать в c файле
JNIEXPORT jint JNICALL Java_com_marakana_NativeLib_add
(JNIEnv * env, jobject obj, jint value1, jint value2) {
printf("\n this is log messge \n");
return (value1 + value2);
}
затем откуда этот printf напечатает это сообщение?
В logcate я не понимаю?
Как я могу отладить любое приложение NDK, поместив сообщения журнала?
Ответы
Ответ 1
используйте __android_log_print()
. Вы должны включить заголовок <android/log.h>
Пример примера. __android_log_print(ANDROID_LOG_DEBUG, "LOG_TAG", "\n this is log messge \n");
Вы также можете использовать спецификатор формата, например printf -
__android_log_print(ANDROID_LOG_DEBUG, "LOG_TAG", "Need to print : %d %s",int_var, str_var);
Убедитесь, что вы также связываетесь с библиотекой протоколирования в вашем файле Android.mk:
LOCAL_LDLIBS := -llog
Ох.. забыл.. Выход будет показан в Logcat
с тегом LOG_TAG
Легкий подход
Добавьте в общий заголовочный файл следующие строки.
#include <android/log.h>
#define LOG_TAG "your-log-tag"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
// If you want you can add other log definition for info, warning etc
Теперь просто вызовите LOGD("Hello world") or LOGE("Number = %d", any_int)
как printf in c
.
Не забудьте включить общий заголовочный файл.
Удалить журнал
Если вы определите LOGD(...)
empty, все журналы исчезнут. Просто комментарий после LOGD(...)
.
#define LOGD(...) // __android_log..... rest of the code
Ответ 2
Существует два варианта:
1) замените printf на __android_log_print. Вы можете сделать это легко с определением в начале кода:
#define printf(...) __android_log_print(ANDROID_LOG_DEBUG, "TAG", __VA_ARGS__);
Конечно, это потребует изменения всего исходного кода, который имеет printf.
2) перенаправить stdout и stderr на Android-logcat (не уверен, что это будет работать на ненагруженном устройстве): http://developer.android.com/guide/developing/debugging/debugging-log.html#viewingStd p >
Ответ 3
не нужно корневое устройство, acroding to http://developer.android.com/guide/developing/debugging/debugging-log.html#viewingStd, ниже может работать префектно.
$ adb shell
$ su
$ stop
$ setprop log.redirect-stdio true
$ start
сделано!