4

android.util.Log源代码。

在最底部(第 340 行),方法中有什么:

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

我想println_native()它或多或少像它println(),只是int bufID不同。

但即使我得到了 的代码println_native(),我仍然缺乏com.android.internal.os.RuntimeInit(第 19 行,第 19 行)在旧的 Android 版本中import进行模拟。android.util.Log

4

2 回答 2

8

刚刚在android源代码中做了一些挖掘。该函数映射到

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 回答