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如下:

 

 

 

 

 

设置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 int  DEFAULT_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;
    }
    int    Log::DEFAULT_MIN_LEVEL = ANDROID_LOG_DEBUG;
    bool   Log::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

你可能感兴趣的:(NDK,kotlin,面试)