在调试js时,js里面的C++代码用Android本省带有的LOGD等这些log函数无法将log打印到屏幕上,在网上查找到一个解决的方法:
LOGW(a) __android_log_write(ANDROID_LOG_WARN,LOG_TAG,a)
但是这个log函数只能打印字符串无法打印一个变量的值,这在调试时就很不方便了,受到这个log函数的启发,于是自己写了一个log函数添加到android的系统里.这个函数的功能和printf()函数一样,可以打印你想要的内容。
首先在/system/core/liblog/目录下的logd_write.c中把自己写的log函数的实现写到这里
log函数的实现:
int JSLOG(int prio, char * tag, char * format,...)
{
va_list ap;
char buf[1024];
va_start(ap,format);
vsnprintf(buf, 1024, format, ap);
va_end(ap);
return __android_log_write(prio, tag, buf);
}
再将函数的声明添加到system/core/include/cutils/log.h文件中
或将函数的声明放到system/core/include/android/log.h文件中
(将函数的声明放到上述的两个文件中个那一个都可以,只要在你引用这个函数时加上这个函数的声明的头文件即可)
我又将这个函数进行了一下封装,封装的思想是,原有的JSLOG()这个函数只会打印你输入的信息,不会自动的打印这个log函数所在的函数的函数名和log函数所在文件的行数,如果不进行一下封装,要想打印函数名和log信息所在文件的行数,就的每次在写log时都的重复的将打印函数名的宏和打印行数的宏写上,为了减少重复的工作于是进行了一下封装。
将其写在一个同文件里,详细内容如下:
#ifndef OWNLOG_H
#define OWNLOG_H
#include <android/log.h>
/*
如果log函数的声明放到system/core/include/android/log.h目录下这里就应该写上这个头文件
*如果是函数声明是放到了system/core/include/cutils/log.h 这个头文件里 这里就要写上
*#include <cutils/log.h>
*/
#define JS_LOG 1 // 这里定义JS_LOG这个宏是为了调试时用 宏为1时打印log 否则不打印log
#if JS_LOG
#define JS(fmt,...) JSLOG(ANDROID_LOG_WARN, LOG_TAG, "%s (line: %d) " fmt, __FUNCTION__,__LINE__,##__VA_ARGS__)
#define LOGW(a) __android_log_write(ANDROID_LOG_WARN,LOG_TAG,a)
#else
#define JS(ftm,...) ((void)0)
#define LOGW(a)((void)0)
#endif
#endif
注__FUNCTION__在打印函数名是不会打印这个函数所在的文件的全路径
而__func__在打印函数名时会打印这个函数所在的文件的全路径