Here是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
。
答案 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