在Android原生NDK中记录变量值

54

我在Android NDK中使用C++设置了日志记录。

我可以像这样将消息打印到logcat:

__android_log_write(ANDROID_LOG_INFO, "tag here", "message here");

假设我有一个名为testint的整数。如何打印这个整数的值?

类似下面这样的代码会打印出地址,但我想要的是它的值。我在C++中没有找到相关内容。感谢任何帮助!

__android_log_print(ANDROID_LOG_INFO, "sometag", "%p", *test);
4个回答

75

这是我见过的最简洁的方法:

#include <android/log.h>

#define  LOG_TAG    "someTag"

#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
#define  LOGW(...)  __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)
#define  LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)

...

// Now you can log very simply like this:
int foo = 42;
LOGD( "This is a number from JNI: %d", foo );

另外,请确保在 Android.mk 文件中链接到日志库:

LOCAL_LDLIBS    := -llog

我该如何使用它来打印C++字符串? - Noman Akhtar
同样的方式,只需调用定义的宏: LOGI(“这是一个字符串”); - Teocci
1
哦,太棒了!我4年前用过这些宏,现在又来了!谢谢 ;) - Ahmed Hegazy

53

您可以使用__android_log_print,它使用类似于sprintf的语法,将您的数据格式化为字符串。

__android_log_print(ANDROID_LOG_INFO, "sometag", "test int = %d", testInt);

16

利用可变参数日志打印函数。对于我自己的代码,我提供LogInfo()函数使其更简单易用。当然这里还有其他几个选项可供选择。

void LogInfo(const char *sTag, const char *fmt, ...)
{
  va_list ap;
  va_start(ap, fmt);
  __android_log_vprint(ANDROID_LOG_INFO, sTag, fmt, ap);
  va_end(ap);
}

1
感谢@mah提供的解决方案,但是我按照上面的方法实现时出现了以下错误:A/libc(18350): Fatal signal 7 (SIGBUS) at 0x00000000 (code=128), thread 18410 (WebViewCoreThre)。此外,参数未正确打印,可能是指向错误的内存地址。您有任何想法吗?非常感谢。 - Lisarien
1
事实上,我犯了一个错误,使用了__android_log_print而不是__android_log_vprint。使用后者,值可以在控制台中正确显示,但几秒钟后我总是会收到上述错误并且应用程序被终止。 - Lisarien
1
@Lisarien,你贴出的错误意味着你试图访问一个空的内存位置——可能是你使用了未正确初始化的指针。这有太多的可能性,无法通过 Stack Overflow 的评论功能进行诊断。我建议你尝试找到错误发生的确切行数(通过添加额外的日志语句来查看代码运行到哪里)。如果你仍然无法解决问题,你应该发布一个带有错误和崩溃发生区域的代码问题。 - mah
当我尝试打印double或float时(使用整数时不会出现问题),错误恰好发生在行__android_log_vprint(ANDROID_LOG_INFO, sTag, fmt, ap);。传递给logInfo的变量被初始化为double var = 7.7;。例如,当我直接调用__android_log_vprint(而不使用logInfo)时,就不再出现问题了。 - Lisarien
1
我不知道你所看到的原因(这也是将其作为新问题发布的另一个好理由;你将得到比我更多的关注)。但如果你只是想要快速解决,你的描述听起来像是@Adam基于宏的建议(在此页面上回答)可以帮助你。 - mah
显示剩余2条评论

11

__android_log_print()函数需要一个格式字符串和一个可变参数列表,要打印有符号整数的格式说明符是"%d"。 所以你想要的东西应该像这样:

int foo = 42;
__android_log_print(ANDROID_LOG_INFO, "SomeTag", "foo is %d", foo);

要了解有关格式字符串的更多信息,请参阅sprintf手册


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接