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 <cstdlib>
#include <time.h>
#include "android_log.h"
#define TAG "ndk-jni" // 这个是自定义的LOG的标识
static bool isEnableLog = false;
static char *file_path = nullptr;
void setEnableLog(bool enable) {
isEnableLog = enable;
}
void setFilePath( char *file){
file_path = file;
}
bool getEnableLog(){
return isEnableLog;
}
long long GetTimeStamp() {
long long timestamp = std::chrono::duration_cast<std::chrono::microseconds>(
std::chrono::system_clock::now().time_since_epoch()).count();
return timestamp;
}
void writeToFile(const char *msg, va_list vaList) {
if (!file_path) {
return;
}
char *contentMsg;
int len = vasprintf(&contentMsg, msg, vaList);
if (len > 0) {
FILE *fp = fopen(file_path, "a+");
if (!fp) {
__android_log_print(ANDROID_LOG_DEBUG,TAG ,"The file %s open failed",file_path);
return;
}
long long timeStamp = GetTimeStamp();
time_t dt = timeStamp / 1000000;
int ms = (int) (timeStamp - dt * 1000000);
tm t; // tm结构指针
localtime_r(&dt, &t);
fprintf(fp, "%04d-%02d-%02d %02d:%02d:%02d.%04d",
t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec, ms);
fprintf(fp, "[%s]:%s", TAG, contentMsg);
fprintf(fp, "\n");
// fflush(fp); //刷新缓存会导致书写很慢
fclose(fp);
free(contentMsg);
}
}
void LOGD(const char *msg, ...) {
if (!isEnableLog){
return;
}
if (msg == nullptr){
return;
}
va_list vaList;
va_start(vaList, msg);
__android_log_vprint(ANDROID_LOG_DEBUG, TAG, msg, vaList);
writeToFile(msg, vaList);
va_end(vaList);
}
void LOGI(const char *msg, ...) {
if (!isEnableLog){
return;
}
if (msg == nullptr){
return;
}
va_list vaList;
va_start(vaList, msg);
__android_log_vprint(ANDROID_LOG_INFO,TAG,msg,vaList);
writeToFile(msg, vaList);
va_end(vaList);
}
void LOGW(const char *msg, ...) {
if (!isEnableLog){
return;
}
if (msg == nullptr){
return;
}
va_list vaList;
va_start(vaList, msg);
__android_log_vprint(ANDROID_LOG_WARN,TAG,msg,vaList);
writeToFile(msg, vaList);
va_end(vaList);
}
void LOGE(const char *msg, ...) {
if (!isEnableLog){
return;
}
if (msg == nullptr){
return;
}
va_list vaList;
va_start(vaList, msg);
__android_log_vprint(ANDROID_LOG_ERROR,TAG,msg,vaList);
writeToFile(msg, vaList);
va_end(vaList);
}
void LOGF(const char *msg, ...){
if (!isEnableLog){
return;
}
if (msg == nullptr){
return;
}
va_list vaList;
va_start(vaList, msg);
__android_log_vprint(ANDROID_LOG_DEFAULT,TAG,msg,vaList);
writeToFile(msg, vaList);
va_end(vaList);
}