4

これandroid.util.Logソースコードです。

一番下 (340 行目) のメソッドの内容:

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

println_native()多かれ少なかれ似ていると思いますがprintln()int bufID違うだけです。

しかし、 のコードを取得しても、古い Android バージョンでシミュレートするにはprintln_native()まだ不足していますcom.android.internal.os.RuntimeInit(19 行目、 )。importandroid.util.Log

4

2 に答える 2

8

アンドロイドのソースコードを少し掘り下げました。この関数は

static jint android_util_Log_println_native(JNIEnv* env, jobject clazz,
    jint bufID, jint priority, jstring tagObj, jstring msgObj)
{
const char* tag = NULL;
const char* msg = NULL;

if (msgObj == NULL) {
    jniThrowNullPointerException(env, "println needs a message");
    return -1;
}

if (bufID < 0 || bufID >= LOG_ID_MAX) {
    jniThrowNullPointerException(env, "bad bufID");
    return -1;
}

if (tagObj != NULL)
    tag = env->GetStringUTFChars(tagObj, NULL);
msg = env->GetStringUTFChars(msgObj, NULL);

int res = __android_log_buf_write(bufID, (android_LogPriority)priority, tag, msg);

if (tag != NULL)
    env->ReleaseStringUTFChars(tagObj, tag);
env->ReleaseStringUTFChars(msgObj, msg);

return res;
}

基本的に、これはシステム内のドライバーに引数を渡し、ログバッファーに書き込みます。ログ バッファは/dev/log、Linux カーネルでポイントされます。

于 2013-05-14T17:13:56.533 に答える
2

SDK をダウンロードしたら、使用findしてファイルを掘ることができます。Java コードは、jni を介して cpp コードにリンクされています。

あなたの場合、このコマンドを使用して関連ファイルを見つけることができます。

find framework -type f -name "*.cpp" -exec grep "println_native" {} \; -ls

次に、Java関数がこのファイルにリンクされていることがわかります:framework/base/core/jni/android_util_Log.cpp

于 2015-10-14T13:38:13.387 に答える