Исходный код, который печатает на stderr:
extern "C" {
/* error: output error message */
void Error(const int error, char *message, ...)
{
va_list arg;
fflush(stdout);
fflush(stderr);
if (error > 0)
fprintf(stderr, "\nError: ");
else
fprintf(stderr, "\nWarning: ");
va_start(arg, message);
vfprintf(stderr, message, arg);
va_end(arg);
fflush(stderr);
if (error > 0)
exit(error);
}
void main(){
Error(0,"Problem %s in file", "sometext");
}
}//extern "C"
Я изменил свой код, чтобы выглядеть так. Он должен печатать до logcat
extern "C" {
#include <android/log.h>
#include <jni.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <math.h>
/* error: output error message */
void Error(const int error, char *message, ...)
{
va_list arg;
va_start(arg, message);
if (error > 0)
__android_log_print(ANDROID_LOG_ERROR, "HTS_API", message, arg);
else
__android_log_print(ANDROID_LOG_WARN, "HTS_API", message, arg);
va_end(arg);
if (error > 0)
exit(error);
}
void main(){
Error(0,"Problem %s in file", "sometext");
}
}//extern "C"
Проблема в том, что мой код выводит: 'Problem | ;A.| ;A. in file'
'Problem | ;A.| ;A. in file'
и __android_log_print(ANDROID_LOG_WARN, "HTS_API","Problem %s in file", "sometext");
Правильный вывод: 'Problem sometext in file'
Что я делаю не так?
__android_log_print
не принимает параметр va_list
в качестве параметра. Он принимает список переменных параметров.
Это похоже на новейшие NDK, которые они добавили
int __android_log_vprint(int prio, const char *tag, const char *fmt, va_list ap);
который вы хотите. Раньше вам приходилось исправлять эту проблему путем повторной реализации Error
в виде макроса с переменным списком аргументов или с помощью vsprintf
для форматирования сообщения об ошибке в буфере, а затем сказать
__android_log_print(ANDROID_LOG_WARN, "HTS_API", "%s", buf);
Error
но называете этоerror
. Кроме того, это должно бытьint main
.