美文网首页
NDK JNI 日志工具类

NDK JNI 日志工具类

作者: izheer | 来源:发表于2023-01-28 10:42 被阅读0次

    1、全局获取JNIEnv对象

    Env_util.h

    class JniData{
    public:
        static JavaVM *vm;
    };
    
    
    JNIEnv *GetAttachEnv(int *attach);
    
    jint DetachEnv();
    

    Env_util.cpp

    #include <jni.h>
    #include "Env_util.h"
    
    JavaVM *JniData::vm = nullptr;
    
    /**
    * 依据JavaVM获取JNIEnv对象
    * @param vm
    * @param attach
    * @return
    */
    JNIEnv *GetAttachEnv(int *attach) {
        if (JniData::vm == NULL){
            return NULL;
        }
        *attach = 0;
        JNIEnv *jni_env = NULL;
        int status = JniData::vm->GetEnv((void **) &jni_env, JNI_VERSION_1_6);
        if (status == JNI_EDETACHED || jni_env == NULL) {
            status = JniData::vm->AttachCurrentThread(&jni_env, NULL);
            if (status < 0) {
                jni_env = NULL;
            } else {
                *attach = 1;
            }
        }
        return jni_env;
    }
    
    
    jint DetachEnv() {
        return JniData::vm->DetachCurrentThread();
    }
    

    2、log日志打印

    android_log.h

    #include<android/log.h>
    #include <jni.h>
    #include <chrono>
    //开关
    void setEnableLog(bool enable);
    bool getEnableLog();
    
    void LOGD(const char *msg, ...);
    void LOGI(const char *msg, ...);
    void LOGW(const char *msg, ...);
    void LOGE(const char *msg, ...);
    void LOGF(const char *msg, ...);
    
    //#define ANDROID_JNI_LOG 1 //打开/屏蔽此宏定义,用于切换打开Jni日志开关
    //
    //#ifdef ANDROID_JNI_LOG
    //
    //#define TAG "ndk-jni" // 这个是自定义的LOG的标识
    //
    //#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__) // 定义LOGD类型
    //#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG ,__VA_ARGS__) // 定义LOGI类型
    //#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,TAG ,__VA_ARGS__) // 定义LOGW类型
    //#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG ,__VA_ARGS__) // 定义LOGE类型
    //#define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,TAG ,__VA_ARGS__) // 定义LOGF类型
    //
    //#else
    //
    //#define LOGD(...)
    //#define LOGI(...)
    //#define LOGW(...)
    //#define LOGE(...)
    //#define LOGF(...)
    //
    //#endif
    

    android_log.cpp

    #include <cstdio>
    #include "android_log.h"
    
    #define TAG "ndk-jni" // 这个是自定义的LOG的标识
    
    static bool isEnableLog = false;
    
    void setEnableLog(bool enable) {
        isEnableLog = enable;
    }
    
    bool getEnableLog(){
        return isEnableLog;
    }
    
    void LOGD(const char *msg, ...) {
    
        if (!isEnableLog){
            return;
        }
    
        char* contentMsg;
    
        va_list vaList;
        va_start(vaList, msg);
        vasprintf(&contentMsg, msg, vaList);
        va_end(vaList);
        __android_log_write(ANDROID_LOG_DEBUG, TAG, contentMsg);
    
    //    __android_log_vprint(ANDROID_LOG_DEBUG,TAG,msg,vaList);
    }
    
    void LOGI(const char *msg, ...) {
        if (!isEnableLog){
            return;
        }
    
        char* contentMsg;
        va_list vaList;
        va_start(vaList, msg);
        vasprintf(&contentMsg, msg, vaList);
        va_end(vaList);
        __android_log_write(ANDROID_LOG_INFO, TAG, contentMsg);
    }
    
    void LOGW(const char *msg, ...) {
        if (!isEnableLog){
            return;
        }
        char* contentMsg;
        va_list vaList;
        va_start(vaList, msg);
        vasprintf(&contentMsg, msg, vaList);
        va_end(vaList);
        __android_log_write(ANDROID_LOG_WARN, TAG, contentMsg);
    }
    
    void LOGE(const char *msg, ...) {
        if (!isEnableLog){
            return;
        }
        char* contentMsg;
        va_list vaList;
        va_start(vaList, msg);
        vasprintf(&contentMsg, msg, vaList);
        va_end(vaList);
        __android_log_write(ANDROID_LOG_ERROR, TAG, contentMsg);
    }
    
    
    void LOGF(const char *msg, ...){
        if (!isEnableLog){
            return;
        }
    
        char* contentMsg;
        va_list vaList;
        va_start(vaList, msg);
        vasprintf(&contentMsg, msg, vaList);
        va_end(vaList);
        __android_log_write(ANDROID_LOG_DEFAULT, TAG, contentMsg);
    }
    
    

    相关文章

      网友评论

          本文标题:NDK JNI 日志工具类

          本文链接:https://www.haomeiwen.com/subject/avmyhdtx.html