Android的JNI開(kāi)發(fā),C++在Native層輸出日志方案

有時(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容