在Java核心庫中列印log

來源:互聯網
上載者:User

Android啟動Zygote進程後,在接收命令fork子進程之前會進行一些初始化,載入Java的核心庫就是很重要的一步。這些核心庫的源碼位於/libcore/luni目錄下。

現在碰到了一個問題,由於Zygote載入Java核心庫時,調用了TimeZones.java中的createZoneStringsFor靜態方法對靜態欄位TimeZones.CachedTimeZones.names進行初始化時出現了問題,導致VM崩潰。調試時,需要在createZoneStringsFor方法中列印一些LOG對一些欄位的值進行驗證。嘗試了幾種方式,都不行。像System.out,因為在Zygote的這個階段,out代表的FileDescriptor是空,所以無效。而android.util.Log構建在Java核心庫之上,這個時候還用不了。最後,看了一下android.util.Log,發現最終調用的還是<cutils/log.h>,就把這些東西搬到了Java核心庫裡。

 

一、把android.util.Log裡面的本地方法移到/framework/base/core/java/android/util/Log.java

public static native int println_native(int bufID, int priority, String tag, String msg);

二、把/framework/base/core/jni/android_util_Log.cpp中對之對應的本地方法移到/libcore/luni/src/main/native/TimeZones.cpp

static jint android_util_Log_println_native(JNIEnv* env, jobject clazz,

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

{

    ... ...

}

三、在/libcore/luni/src/main/native/TimeZones.cpp檔案中註冊本地方法

static JNINativeMethod gMethods[] = {

    NATIVE_METHOD(TimeZones, getDisplayNameImpl, "(Ljava/lang/String;ZILjava/lang/String;)Ljava/lang/String;"),

    NATIVE_METHOD(TimeZones, forCountryCode, "(Ljava/lang/String;)[Ljava/lang/String;"),

    NATIVE_METHOD(TimeZones, getZoneStringsImpl, "([[Ljava/lang/String;Ljava/lang/String;)V"),

    NATIVE_METHOD(TimeZones, log, "(IILjava/lang/String;Ljava/lang/String;)I"),

};

 

這樣,在TimeZones.java中就可以利用名字為log的本地方法列印LOG了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.