有時(shí)候我們需要輸出Native的日志到文件中,不僅僅是輸出到logcat,以便以后續(xù)定位問(wèn)題。實(shí)現(xiàn)這種方式有比較簡(jiǎn)單的方案,就是通過(guò)C++調(diào)用Java代碼,把日志傳輸?shù)絁ava層,那么我們就可以任意處理日志了。
ALog.cpp
#include <jni.h>
JavaVM *jvm;
jclass aLogClass;
jmethodID aLogMethodID;
#define ALOG_DEBUG 3
#define ALOG_INFO 4
#define ALOG_WARN 5
#define ALOG_ERROR 6
#define LOGI(...) __alog_log(ALOG_INFO, __VA_ARGS__)
#define LOGD(...) __alog_log(ALOG_DEBUG, __VA_ARGS__)
#define LOGW(...) __alog_log(ALOG_WARN, __VA_ARGS__)
#define LOGE(...) __alog_log(ALOG_ERROR, __VA_ARGS__)
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) {
jvm = vm;
JNIEnv *env;
jint onLoad_err = -1;
if (vm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK) {
return onLoad_err;
}
if (env == nullptr) {
return onLoad_err;
}
aLogClass = env->FindClass("com/taoweiji/xlogtest/ALog");
aLogMethodID = env->GetStaticMethodID(aLogClass, "log","(ILjava/lang/String;Ljava/lang/String;)V");
return JNI_VERSION_1_6;
}
void __alog_log(int level, const char *tag, const char *msg) {
JNIEnv *env;
jvm->GetEnv((void **) &env, JNI_VERSION_1_6);
env->CallStaticObjectMethod(aLogClass, aLogMethodID, level, jniEnv->NewStringUTF(tag),jniEnv->NewStringUTF(msg));
}
void __alog_log(int level, std::string tag, std::string msg) {
__alog_log(level, tag.c_str(), msg.c_str());
}
對(duì)于的Java類
public class ALog {
public static final int DEBUG = 3;
public static final int INFO = 4;
public static final int WARN = 5;
public static final int ERROR = 6;
public static void log(int level, String tag, String msg) {
if (level == ERROR) {
Log.e(tag, msg);
} else if (level == WARN) {
Log.w(tag, msg);
} else if (level == INFO) {
Log.d(tag, msg);
} else {
Log.i(tag, msg);
}
//TODO 寫入文件
}
}
使用之前必須對(duì)進(jìn)行初始化
public class MyApplication extends Application{
static {
System.loadLibrary("native-lib");
}
@Override
public void onCreate() {
super.onCreate();
ALog.initALog();
}
}
測(cè)試結(jié)果
06-27 19:14:22.374 21985-21985/com.taoweiji.xlogtest D/alog: test