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