如何将变量参数传递给__android_log_print?

eh57zj3b  于 2023-02-14  发布在  Android
关注(0)|答案(1)|浏览(120)

打印到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'
直接调用logger函数,我将得到预期的输出。
__android_log_print(ANDROID_LOG_WARN, "HTS_API","Problem %s in file", "sometext");
预期输出为:'Problem sometext in file'
我哪里做错了?

h7wcgrx3

h7wcgrx31#

__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);

相关问题