log函数封装,让WIN32和android ndk共用相同的log函数,方便调试

_log.h

[cpp]  view plain copy
  1. #ifdef __cplusplus  
  2. extern "C" {   
  3. #endif  
  4.   
  5. typedef int (* funcPtr)(const char * format, ...);  
  6.   
  7. typedef struct _Log  
  8. {  
  9.     funcPtr d;  
  10.     funcPtr i;  
  11.     funcPtr e;  
  12. }LOG;  
  13. extern const LOG Log;  
  14.   
  15. #ifdef __cplusplus  
  16. };   
  17. #endif  

_log.c

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <stdarg.h>  
  4. #include "_log.h"  
  5.   
  6. #define BUFFER_SIZE (1024 * 2)  
  7. static char db_buffer[BUFFER_SIZE];  
  8.   
  9. #ifdef WIN32  
  10.   
  11. #   define vsnprintf _vsnprintf  
  12.   
  13. #   define LOGD printf  
  14. #   define LOGI printf  
  15. #   define LOGW printf  
  16. #   define LOGE printf  
  17. #   define LOGF printf  
  18.   
  19. #else // #ifdef WIN32  
  20.   
  21. #   include <jni.h>  
  22. #   include <android/log.h> // 这个是输出LOG所用到的函数所在的路径  
  23. #   define LOG_TAG    "JNILOG" // 这个是自定义的LOG的标识  
  24. #   undef LOG // 取消默认的LOG  
  25.   
  26. //Android.mk中要添加LOCAL_LDLIBS := -llog  
  27. //# 如果不包含这一句的话,会提示:__android_log_print 未定义  
  28. #   define LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__) // 定义LOG类型  
  29. #   define LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) // 定义LOG类型  
  30. #   define LOGW(...)  __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__) // 定义LOG类型  
  31. #   define LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) // 定义LOG类型  
  32. #   define LOGF(...)  __android_log_print(ANDROID_LOG_FATAL,LOG_TAG,__VA_ARGS__) // 定义LOG类型  
  33.   
  34. #endif //#ifdef WIN32  
  35.   
  36. #define db_print(__tag, __p, __format) \  
  37.     do { \  
  38.     int n = 0; \  
  39.     va_list args; \  
  40.     va_start(args, __format); \  
  41.     vsnprintf(db_buffer, BUFFER_SIZE - 1, __format, args); \  
  42.     db_buffer[BUFFER_SIZE - 1] = 0; \  
  43.     __p(__tag);\  
  44.     n = __p(db_buffer); \  
  45.     va_end(args); \  
  46.     return n; \  
  47. while (0)  
  48.   
  49.   
  50. static int log_d(const char * format, ...)  
  51. {  
  52. #ifdef _DEBUG  
  53.     db_print("debug: ", LOGD, format);  
  54. #else  
  55.     return 0;  
  56. #endif  
  57. }  
  58.   
  59. static int log_i(const char * format, ...)  
  60. {  
  61.     db_print("info : ", LOGI, format);  
  62. }  
  63.   
  64. static int log_e(const char * format, ...)  
  65. {  
  66.     db_print("error: ", LOGE, format);  
  67. }  
  68.   
  69. const LOG Log =   
  70. {  
  71.     log_d,  
  72.     log_i,  
  73.     log_e,  
  74. };  


Android.mk

[java]  view plain copy
  1. LOCAL_PATH := $(call my-dir)  
  2. include $(CLEAR_VARS)  
  3. LOCAL_MODULE := init  
  4. LOCAL_SRC_FILES := _log.c  
  5. LOCAL_LDLIBS := -llog  
  6. include $(BUILD_SHARED_LIBRARY)  

 
 
 
 WIN32下测试 
 
main.c

[cpp]  view plain copy
  1. #include "_log.h"  
  2. int main(int argc, char * argv[])  
  3. {  
  4.     Log.d("dddddddd\n");  
  5.     Log.i("iiiiiiii\n");  
  6.     Log.e("eeeeeeee\n");  
  7.     return 0;  
  8. }  

运行结果

debug: dddddddd
info : iiiiiiii
error: eeeeeeee


注意:Android.mk中要添加LOCAL_LDLIBS := -llog# 如果不包含这一句的话,会提示:__android_log_print 未定义

你可能感兴趣的:(android,Module,buffer,Build,include,library)