Log.java

源码目录:frameworks/base/core/java/android/util

编译目录:frameworks/base

image.png

我惊奇的发现,Log.java里没有定义println_native方法,也没有System.loadLibary任何的so库。带着这个疑问,我们来看c层代码。

android_util_Log.cpp

源码目录:frameworks/base/core/jni

编译目录:frameworks/base/core/jni

/*

* JNI registration.

*/

static JNINativeMethod gMethods[] = {

/* name, signature, funcPtr */

{ "isLoggable", "(Ljava/lang/String;I)Z", (void*) android_util_Log_isLoggable },

{ "println_native", "(IILjava/lang/String;Ljava/lang/String;)I", (void*) android_util_Log_println_native },

};

int register_android_util_Log(JNIEnv* env)

{

jclass clazz = env->FindClass("android/util/Log");

if (clazz == NULL) {

ALOGE("Can't find android/util/Log");

return -1;

}

levels.verbose = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "VERBOSE", "I"));

levels.debug = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "DEBUG", "I"));

levels.info = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "INFO", "I"));

levels.warn = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "WARN", "I"));

levels.error = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "ERROR", "I"));

levels.assert = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "ASSERT", "I"));

return AndroidRuntime::registerNativeMethods(env, "android/util/Log", gMethods, NELEM(gMethods));

}

看了https://blog.csdn.net/flydream0/article/details/7371692这篇博客才知道,这种是显示注册native方法的一种方式。 android源码里基本都采用这种方式来注册native方法。

Android源代码介绍,Android-Log源码详解相关推荐

  1. Android进阶笔记:Messenger源码详解

    Messenger可以理解为一个是用于发送消息的一个类用法也很多,这里主要分析一下再跨进程的情况下Messenger的实现流程与源码分析.相信结合前面两篇关于aidl解析文章能够更好的对aidl有一个 ...

  2. 安卓开发基础面试题,Android面试必备的集合源码详解,附小技巧

    去年无疑是 Flutter 技术如火如荼发展的一年. 每一个移动开发者都在为 Flutter 带来的"快速开发.富有表现力和灵活的 UI.原生性能"的特色和理念而痴狂,从超级 Ap ...

  3. Android AR开发实践之七:OpenGLES相机预览背景绘制源码详解

    Android AR开发实践之七:OpenGLES相机预览背景绘制源码详解 目录 Android AR开发实践之七:OpenGLES相机预览背景绘制源码详解 一.OpenGL ES渲染管线 1.基本处 ...

  4. 源码详解Android 9.0(P) 系统启动流程之SystemServer

    源码详解Android 9.0(P) 系统启动流程目录: 源码详解Android 9.0(P)系统启动流程之init进程(第一阶段) 源码详解Android 9.0(P)系统启动流程之init进程(第 ...

  5. Android 事件分发机制分析及源码详解

    Android 事件分发机制分析及源码详解 文章目录 Android 事件分发机制分析及源码详解 事件的定义 事件分发序列模型 分发序列 分发模型 事件分发对象及相关方法 源码分析 事件分发总结 一般 ...

  6. Android编程之Intent源码详解

    Intent源码详解,直接开始入题: Intent源码6700多行代码,但真正核心代码 就那么几百行,大部分都用来定义常量字符串了 先来看一下 public class Intent implemen ...

  7. Tensorflow 2.x源码详解之开宗明义:基本介绍和张量(万文多图)

      大家好,我是爱编程的喵喵.双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中.从事机器学习以及相关的前后端开发工作.曾在阿里云.科大讯飞.CCF等比赛获得多次Top名次.现 ...

  8. Integer源码详解

    尊重原创,转载请标明出处    http://blog.csdn.net/abcdef314159 对于Integer这个类估计大家也都非常熟悉了,以前看过他的源码,但也只是粗略的看了一下,最近有时间 ...

  9. OkHttp3源码详解

    前言:为什么有些人宁愿吃生活的苦也不愿吃学习的苦,大概是因为懒惰吧,学习的苦是需要自己主动去吃的,而生活的苦,你躺着不动它就会来找你了. 一.概述 OKHttp是一个非常优秀的网络请求框架,已经被谷歌 ...

  10. cocos android-1,Cocos2D-Android-1之源码详解:5.Box2dTest

    Cocos2D-Android-1之源码详解:5.Box2dTest 发布时间:2020-08-06 06:19:28 来源:51CTO 阅读:398 作者:abab99 package org.co ...

最新文章

  1. TensorFlow介绍之TF数据流图
  2. Bootstrap系列 -- 37. 基础导航样式
  3. 关于单元测试脚手架的几点思考
  4. linux普通用户发送信号,Linux信号发送与作业控制
  5. NLP复习资料(5)-第九章 句法分析
  6. 京东抢购助手_[Windows] 京东极速抢购助手V2.0,支持京东健康+扫货抢购
  7. 接手一个APP,如何从0到1去做测试体系的搭建?
  8. java设计模式2--工厂模式
  9. [Markdown] Markdown使用 - 持续更新
  10. css伪类选择器,:link、:visited、:focus、:hover、:active、:first-child
  11. CSS3中很容易混淆的transform,translate,transition。如何去区分,以及综合写法。
  12. 设置finder窗口大小的5个小技巧!速看?
  13. oracle pdb与cdb区别,CDB与PDB的系统关系
  14. 20230220学习总结02
  15. linux下设置定时执行脚本
  16. mysql 双1设置_mysql 双1设置
  17. 成功解决ERROR: Could not build wheels for bottleneck, which is required to install pyproject.toml-based
  18. 解决每次启动都弹出UAC对话框
  19. Mac OS X 背后的故事(四)——政客的跨界
  20. 恢复计算机后无法开机密码,Win7系统电脑无法修改开机密码修复方法

热门文章

  1. Mac OS X Yosemite Arduino安装CH340 USB转串口驱动
  2. java实现二叉树的构建以及3种遍历方法
  3. poj2186 求有向图G中所有点都能到达的点的数量
  4. 茫茫IT,我们努力,在努力。
  5. SQL2005的安装
  6. composer安装laravel框架时未生成Vendor解决办法
  7. php性能优化和细节优化
  8. TikTok又添劲敌 Meta元宇宙携Reels宣战
  9. SQL表内查重和删重
  10. vue cli3.3 以上版本配置vue.config.js