NDK|3.NDK Android jni开发 C语言中打印log debug模式下 (相机图片美化)
日志打印:
对于很多Android开发人员来说,Android的标准日志打印已经使用的非常习惯,如果在调试C/C++时使用的是printf或者cout这种方式打印日志,那查找起来会非常不舒服,为了使自己舒服起来,还是有必要使用android标准的日志方式打印日志的。先看一下效果:
引入
导入log头文件
在你使用的 .c/ .cpp 文件中
导入 log.h 头文件
#include
#include #define LOG_TAG"MyDemo"
#define LOGI(...)__android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
#define LOGE(...)__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
#define LOGD(...)__android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
使用
LOGE("myName : %s", name);
// Log.e(TAG,"myName : $name")
LOGD("age: %d",age);
// Log.d(TAG,"age : $age")
在Android.mk里面配置
LOCAL_LDLIBS :=-llog
%s代表的含义
%d代表的含义
#include#include #include #include "com_yuedong_sport_health_jni_HeartRate.h" #include "HeartRate.h" #include "ImageProcess.h"#include #define TAG "Yd-jni" // 这个是自定义的LOG的标识 #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__) // 定义LOGD类型JNIEXPORT jfloat JNICALL Java_com_yuedong_sport_health_jni_HeartRate_getHeartRate (JNIEnv *env, jclass jz, jfloatArray floatArray, jint arrayLength, jint flag) { float array[arrayLength]; env->GetFloatArrayRegion(floatArray, 0, arrayLength, array); vector in_vector; for (int index = 0; index < arrayLength; ++index) { in_vector.push_back(array[index]); } return (jfloat)to_beat(in_vector, flag); }JNIEXPORT jdouble JNICALL Java_com_yuedong_sport_health_jni_HeartRate_decodeYUV420 (JNIEnv *env, jclass jz, jshortArray shortArray, jint arrayLength, jint width, jint height, jint type) {LOGD("########## i = %s", "Java_com_yuedong_sport_health_jni_HeartRate_decodeYUV420--start"); short array[arrayLength]; LOGD("########## i = %s", "Java_com_yuedong_sport_health_jni_HeartRate_decodeYUV420--short array[arrayLength]"); env->GetShortArrayRegion(shortArray, 0, arrayLength, array); LOGD("########## i = %s", "Java_com_yuedong_sport_health_jni_HeartRate_decodeYUV420"); return (jdouble)decodeYUV420SPtoRedBlueGreenAvg(array, width, height, type); }
如果是:cmake的话
demo如下:
【NDK|3.NDK Android jni开发 C语言中打印log debug模式下 (相机图片美化)】
设置debug模式的打印?
方法:在c++中,如何定义全局变量?
或者数据存储
原理:封装成一个公共的类,在方法里面控制。其他地方都可以调用这个类和类的方法。
https://blog.csdn.net/weixin_33709609/article/details/92065843
#include #ifndef LOG_H_ #define LOG_H_ class Log { private: Log(); virtual ~Log(); public: static bool IS_DEBUG; static intDEFAULT_MIN_LEVEL; static void V(const char * tag,const char * msg); static void D(const char * tag,const char * msg); static void I(const char * tag,const char * msg); static void W(const char * tag,const char * msg); static void E(const char * tag,const char * msg); static void F(const char * tag,const char * msg); }; #endif /* LOG_H_ */
#include "Log.h"Log::Log() {} Log::~Log() { Log::DEFAULT_MIN_LEVEL = ANDROID_LOG_DEBUG; Log::IS_DEBUG = false; } intLog::DEFAULT_MIN_LEVEL = ANDROID_LOG_DEBUG; boolLog::IS_DEBUG= true; void Log::D(const char * tag,const char *msg) { if(Log::IS_DEBUG && Log::DEFAULT_MIN_LEVEL<=ANDROID_LOG_DEBUG) { __android_log_print(ANDROID_LOG_DEBUG,tag,"%s",msg); } } void Log::V(const char * tag,const char *msg) { if(Log::IS_DEBUG && Log::DEFAULT_MIN_LEVEL<=ANDROID_LOG_VERBOSE) { __android_log_print(ANDROID_LOG_VERBOSE,tag,"%s",msg); } } void Log::I(const char * tag,const char *msg) { if(Log::IS_DEBUG && Log::DEFAULT_MIN_LEVEL<=ANDROID_LOG_INFO) { __android_log_print(ANDROID_LOG_INFO,tag,"%s",msg); } } void Log::E(const char * tag,const char *msg) { if(Log::IS_DEBUG && Log::DEFAULT_MIN_LEVEL<=ANDROID_LOG_ERROR) { __android_log_print(ANDROID_LOG_ERROR,tag,"%s",msg); } } void Log::W(const char * tag,const char *msg) { if(Log::IS_DEBUG && Log::DEFAULT_MIN_LEVEL<=ANDROID_LOG_WARN) { __android_log_print(ANDROID_LOG_WARN,tag,"%s",msg); } } void Log::F(const char * tag,const char *msg) { if(Log::IS_DEBUG && Log::DEFAULT_MIN_LEVEL<=ANDROID_LOG_FATAL) { __android_log_print(ANDROID_LOG_FATAL,tag,"%s",msg); } }
第一个参数为打印级别,为以下枚举之一:
typedef enum android_LogPriority { ANDROID_LOG_UNKNOWN = 0, ANDROID_LOG_DEFAULT,/* only for SetMinPriority() */ ANDROID_LOG_VERBOSE, ANDROID_LOG_DEBUG, ANDROID_LOG_INFO, ANDROID_LOG_WARN, ANDROID_LOG_ERROR, ANDROID_LOG_FATAL, ANDROID_LOG_SILENT,/* only for SetMinPriority(); must be last */ } android_L
https://blog.csdn.net/wolinxuebin/article/details/80181672
推荐阅读
- android第三方框架(五)ButterKnife
- Android中的AES加密-下
- 带有Hilt的Android上的依赖注入
- android|android studio中ndk的使用
- Android事件传递源码分析
- RxJava|RxJava 在Android项目中的使用(一)
- Android7.0|Android7.0 第三方应用无法访问私有库
- 深入理解|深入理解 Android 9.0 Crash 机制(二)
- android防止连续点击的简单实现(kotlin)
- Android|Android install 多个设备时指定设备