NDK JNI 日志工具类

2023-01-28  本文已影响0人  izheer

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);
}

上一篇下一篇

猜你喜欢

热点阅读