android.util.Log#println_native()中有什么?

时间:2013-05-14 16:21:39

标签: java android logging android-source println

Hereandroid.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行,import)来模拟旧Android版本中的android.util.Log

2 个答案:

答案 0 :(得分:5)

刚刚在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;
}

基本上,这会将参数传递给系统中的驱动程序,该驱动程序将写入Log缓冲区。日志缓冲区由Linux内核中的/dev/log指向。

答案 1 :(得分:1)

下载了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