1. 程式人生 > >android 在Java核心庫libcore中列印log

android 在Java核心庫libcore中列印log

發現在/libcore/luni目錄 也就是java的核心庫裡面,不能用Log  。。。。

怎麼辦呢?

看了篇部落格,博主啊  看的我是懂非懂的,自己做了下,記錄在下

思路就是在核心庫裡面搭建一套呼叫log的框架,也就是搭建JNI;

比如 我想在./libcore/luni/src/main/java/java/io/File.java裡面列印log

步驟1.將frameworks/base/core/java/android/util/Log.java裡面的本地方法copy到File.java檔案裡面;另外建立Log()方法;

    //下面的是建立log方法;
    private static final int LOG_ID_MAIN = 0;
    private static final int DEBUG = 3;
    private static int Log(String tag, String msg) {
        return println_native(LOG_ID_MAIN, DEBUG, tag, msg);
    }
     
    //Log.java裡面的本地方法
    private static native int println_native(int bufID,
            int priority, String tag, String msg);

發現我的型別都是private了吧,以前的是public,不修改的話編譯的時候會錯;

步驟2.把/frameworks/base/core/jni/android_util_Log.cpp中對之對應的本地方法copy到libcore/luni/src/main/native/java_io_File.cpp,加在static JNINativeMethod gMethods[ ]之前就行;下面是copy的本地方法

static jint android_util_Log_println_native(JNIEnv* env, jobject clazz,

        jint bufID, jint priority, jstring tagObj, jstring msgObj)

{

    ... ...

}

步驟3.在libcore/luni/src/main/native/java_io_File.cpp檔案中加入Log註冊本地方法

static JNINativeMethod gMethods[] = {
    ... ...
    { "println_native",  "(IILjava/lang/String;Ljava/lang/String;)I", (void*) android_util_Log_println_native },
};

裡面的{ "println_native",  "(IILjava/lang/String;Ljava/lang/String;)I", (void*) android_util_Log_println_native },就是在frameworks/base/core/jni/android_util_Log.cpp裡面的static JNINativeMethod gMethods[] ={}註冊方法,我只是把他copy了過來;

    ok,現在我們就可以在./libcore/luni/src/main/java/java/io/File.java裡面的任何位置,用剛定義的Log( )方法列印自己需要的log了。