什么是android.util.Log#println_native()?

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

刚刚在android源代码中进行了一些挖掘。 此function映射到

 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缓冲区。 日志缓冲区由/dev/log kernel /dev/log指向Linux内核。

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