android___android_log_print打印函数__源代码

2023-11-11

android端JNI的打印信息:

#include <android/log.h>
#ifndef  LOG_TAG
#define  LOG_TAG    "h264AndroidJNI"
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
#endif



转自:http://www.netmite.com/android/mydroid/system/core/liblog/logd_write.c
/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#include <time.h>
#include <stdio.h>
#ifdef HAVE_PTHREADS
#include <pthread.h>
#endif
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>

#include <utils/logger.h>
#include <cutils/logd.h>

#define LOG_BUF_SIZE	1024

#if FAKE_LOG_DEVICE
// This will be defined when building for the host.
#define log_open(pathname, flags) fakeLogOpen(pathname, flags)
#define log_writev(filedes, vector, count) fakeLogWritev(filedes, vector, count)
#define log_close(filedes) fakeLogClose(filedes)
#else
#define log_open(pathname, flags) open(pathname, flags)
#define log_writev(filedes, vector, count) writev(filedes, vector, count)
#define log_close(filedes) close(filedes)
#endif

typedef enum {
    LOG_ID_MAIN = 0,
    LOG_ID_RADIO,
    LOG_ID_EVENTS,
    LOG_ID_MAX
} log_id_t;

static int __write_to_log_init(log_id_t, struct iovec *vec, size_t nr);
static int (*write_to_log)(log_id_t, struct iovec *vec, size_t nr) =
    __write_to_log_init;
#ifdef HAVE_PTHREADS
static pthread_mutex_t log_init_lock = PTHREAD_MUTEX_INITIALIZER;
#endif

static int log_fds[(int)LOG_ID_MAX] = { -1, -1, -1 };

/*
 * This is used by the C++ code to decide if it should write logs through
 * the C code.  Basically, if /dev/log/... is available, we're running in
 * the simulator rather than a desktop tool and want to use the device.
 */
static enum {
    kLogUninitialized, kLogNotAvailable, kLogAvailable 
} g_log_status = kLogUninitialized;
int __android_log_dev_available(void)
{
    if (g_log_status == kLogUninitialized) {
        if (access("/dev/"LOGGER_LOG_MAIN, W_OK) == 0)
            g_log_status = kLogAvailable;
        else
            g_log_status = kLogNotAvailable;
    }

    return (g_log_status == kLogAvailable);
}

static int __write_to_log_null(log_id_t log_fd, struct iovec *vec, size_t nr)
{
    return -1;
}

static int __write_to_log_kernel(log_id_t log_id, struct iovec *vec, size_t nr)
{
    ssize_t ret;
    int log_fd;

    if (/*(int)log_id >= 0 &&*/ (int)log_id < (int)LOG_ID_MAX) {
        log_fd = log_fds[(int)log_id];
    } else {
        return EBADF;
    }

    do {
        ret = log_writev(log_fd, vec, nr);
    } while (ret < 0 && errno == EINTR);

    return ret;
}

static int __write_to_log_init(log_id_t log_id, struct iovec *vec, size_t nr)
{
#ifdef HAVE_PTHREADS
    pthread_mutex_lock(&log_init_lock);
#endif

    if (write_to_log == __write_to_log_init) {
        log_fds[LOG_ID_MAIN] = log_open("/dev/"LOGGER_LOG_MAIN, O_WRONLY);
        log_fds[LOG_ID_RADIO] = log_open("/dev/"LOGGER_LOG_RADIO, O_WRONLY);
        log_fds[LOG_ID_EVENTS] = log_open("/dev/"LOGGER_LOG_EVENTS, O_WRONLY);

        write_to_log = __write_to_log_kernel;

        if (log_fds[LOG_ID_MAIN] < 0 || log_fds[LOG_ID_RADIO] < 0 ||
                log_fds[LOG_ID_EVENTS] < 0) {
            log_close(log_fds[LOG_ID_MAIN]);
            log_close(log_fds[LOG_ID_RADIO]);
            log_close(log_fds[LOG_ID_EVENTS]);
            log_fds[LOG_ID_MAIN] = -1;
            log_fds[LOG_ID_RADIO] = -1;
            log_fds[LOG_ID_EVENTS] = -1;
            write_to_log = __write_to_log_null;
        }
    }

#ifdef HAVE_PTHREADS
    pthread_mutex_unlock(&log_init_lock);
#endif

    return write_to_log(log_id, vec, nr);
}

int __android_log_write(int prio, const char *tag, const char *msg)
{
    struct iovec vec[3];
    log_id_t log_id = LOG_ID_MAIN;

    if (!tag)
        tag = "";

    /* XXX: This needs to go! */
    if (!strcmp(tag, "HTC_RIL") ||
        !strcmp(tag, "RILJ") ||
        !strcmp(tag, "RILC") ||
        !strcmp(tag, "RIL") ||
        !strcmp(tag, "AT") ||
        !strcmp(tag, "GSM") ||
        !strcmp(tag, "STK"))
            log_id = LOG_ID_RADIO;

    vec[0].iov_base   = (unsigned char *) &prio;
    vec[0].iov_len    = 1;
    vec[1].iov_base   = (void *) tag;
    vec[1].iov_len    = strlen(tag) + 1;
    vec[2].iov_base   = (void *) msg;
    vec[2].iov_len    = strlen(msg) + 1;

    return write_to_log(log_id, vec, 3);
}

int __android_log_vprint(int prio, const char *tag, const char *fmt, va_list ap)
{
    char buf[LOG_BUF_SIZE];    

    vsnprintf(buf, LOG_BUF_SIZE, fmt, ap);

    return __android_log_write(prio, tag, buf);
}

int __android_log_print(int prio, const char *tag, const char *fmt, ...)
{
    va_list ap;
    char buf[LOG_BUF_SIZE];    

    va_start(ap, fmt);
    vsnprintf(buf, LOG_BUF_SIZE, fmt, ap);
    va_end(ap);

    return __android_log_write(prio, tag, buf);
}

void __android_log_assert(const char *cond, const char *tag,
			  const char *fmt, ...)
{
    va_list ap;
    char buf[LOG_BUF_SIZE];    

    va_start(ap, fmt);
    vsnprintf(buf, LOG_BUF_SIZE, fmt, ap);
    va_end(ap);

    __android_log_write(ANDROID_LOG_FATAL, tag, buf);

    __builtin_trap(); /* trap so we have a chance to debug the situation */
}

int __android_log_bwrite(int32_t tag, const void *payload, size_t len)
{
    struct iovec vec[2];

    vec[0].iov_base = &tag;
    vec[0].iov_len = sizeof(tag);
    vec[1].iov_base = (void*)payload;
    vec[1].iov_len = len;

    return write_to_log(LOG_ID_EVENTS, vec, 2);
}

/*
 * Like __android_log_bwrite, but takes the type as well.  Doesn't work
 * for the general case where we're generating lists of stuff, but very
 * handy if we just want to dump an integer into the log.
 */
int __android_log_btwrite(int32_t tag, char type, const void *payload,
    size_t len)
{
    struct iovec vec[3];

    vec[0].iov_base = &tag;
    vec[0].iov_len = sizeof(tag);
    vec[1].iov_base = &type;
    vec[1].iov_len = sizeof(type);
    vec[2].iov_base = (void*)payload;
    vec[2].iov_len = len;

    return write_to_log(LOG_ID_EVENTS, vec, 3);
}

syntax highlighted by Code2HTML, v. 0.9.1


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android___android_log_print打印函数__源代码 的相关文章

  • Android 获取设备名称

    Android 设备名称 例如 通过Build获取 Build DEVICE 结果是 deviceName HWLLD H 明显不是设备名称 查看该参数介绍 指的是工业设计的名称 Global DEVICE NAME Settings Gl
  • Dev C++使用简明教程

    Dev C 使用简明教程 使用高级语言编程时 我们通常使用一个集成开发环境IDE Integrated Developing Enviroment 简称IDE 来进行编辑 编译 运行和调试工作 Dev C 是一个Windows环境下C C
  • Android之通过BaseAdapter自定义适配器的使用

    通过BaseAdapter创建自定义适配器 在所有的适配器中 通过BaseAdapter定义的适配器非常好用 可以自定义ListView每行布局的样式 使用非常的广泛 是开发过程中必不可少的 下面看一个效果图 接下来一起来实现聊天列表 1
  • Mac构建Protobuf

    Protobuf源码下载 https github com JumpWu xls2protobuf tree master protobuf V3 0 1 切换到protobuf V3 0 根目录 运行 autogen sh前 我们需要先安
  • Linux下JDK安装及配置 (tar.gz版)

    安装环境 Linux JDK安装 tar gz为解压后就可以使用的版本 这里我将使用jdk 8u65 linux x64 tar gz版 安装到 usr java 下 步骤一 将文件jdk 8u65 linux x64 gz移动到 usr
  • c++学生信息管理系统(window控制台实现鼠标点击操作)

    翻起大一时写过的作业代码 一个学生信息管理系统 当时不会使用QT 不会MFC等库 只会c 但是又想做一个有界面的 能够实现鼠标操作的程序 于是绞尽脑汁查资料 自己造轮子 最终写出来了下面的这个现在连我自己也看不懂的代码 代码虽然有些长 单文
  • 【android】searchView注意点

    1 安卓闪退 可能由于布局文件有问题 2 searchView 导入android support v7 widget SearchView是用在Actionbar Toolbar 的组建 要在onCreateOptionsMenu初始化
  • Android Bundle类

    今天发现自己连Bundle类都没有搞清楚 于是花时间研究了一下 根据google官方的文档 http developer android com reference android os Bundle html Bundle类是一个key
  • MPAndroidChart 修改柱状图高亮效果

    MPAndroidChart 默认的选中高亮效果如下 只是颜色加深 然后设计想要实现下面这种效果 类似阴影效果 且显示的宽度需要增加 一 MPAndroidChart 是否支持 查看该框架对外的接口 发现下面两个方法 BarDataSet
  • Netlink 内核实现分析(一):创建

    http blog csdn net luckyapple1028 article details 50839395 Netlink 是一种IPC Inter Process Commumicate 机制 它是一种用于内核与用户空间通信的机
  • TCP传输中使用AES加密和gizp压缩

    最近项目需求需要用到TCP传输 为了保证安全传输使用AES 为了使 传输过程中减 数据量小 使用gzip压缩 特此分享一哈 一 AES加密 关于AES的资料网上很多 个人觉得 加密与解密 第三版 很不错 这本书中P155开始讲AES 下载地
  • Embarcadero Dev-C++第一次使用注意事项

    Embarcadero Dev C 第一次使用注意事项 Embarcadero Dev C 简介 2000年左右 Bloodshed software开发了Dev C 提供轻量 免费 开源的C C IDE Dev C 是最适合初学C 语言的
  • AndroidStudio链接手机的步骤

    1 设置手机为开发者模式 设置 gt 关于手机 gt 连续点击MIUI版本 开启成功 2 在更多设置中选择开发者选项 在开发者选项中同时勾选USB调试和USB安装的开关 3 数据线与电脑连接 4 打开AndroidStudio 等待程序加载
  • Android fragment间的通讯

    1 使用FragmentPagerAdapter情况下 param viewpagerId viewpager id eg R id vp param position fragment 的位置 return private Fragmen
  • C/C++中的数据结构对齐,#pragma pack() 和 __attribute__

    C C 中的数据结构对齐 总览 数据结构对齐是指在计算机内存中排列和访问数据的方式 它包含三个独立但相关的问题 数据对齐 data alignment 数据结构填充 data structure padding 和打包 packing 当数
  • Android使用Thread.UncaughtExceptionHandler捕获/分析异常信息

    Thread中提供了一个UncaughtExceptionHandler接口能够获取应用的crash信息 该方法设置系统的默认异常处理器 发生crash的时候 系统就会回调UncaughtExceptionHandler的uncaughtE
  • Android AES加密算法及其实现

    昨天老大叫我看看android加密算法 于是网上找了找 找到了AES加密算法 当然还有MD5 BASE64什么的http snowolf iteye com blog 379860这篇文章列举了很多 但是基本都是j2se平台的 androi
  • Default Activity not found解决方法

    项目场景 最近开始学习Android 第一次尝试建立一个空白项目 手动添加activity时出现报错 Default Activity not found 问题描述 运行时程序可以正常编译 但不能发布到AVD上 查看了几篇博文 发现这篇方法
  • windows下使用CMake构建工程:cmake-gui+Visual Studio

    文件结构 在工程目录下构建目录src thirdparty build src 存放自己写的源代码文件 thirdparty 存放使用的第三方库 build 存放编译时生成的文件 因为很多很杂乱 所以单独目录存放 保持项目文件夹整洁 在bu
  • C++程序的基本组成简介

    C 程序的基本组成简介 C 程序的基本组成 这个C 程序例子 由一个程序单位 程序文件 注 组成 这是一个简单例子未使用类 注 其中包括 1 头文件 可以认为头文件是你在调用函数时的一个桥梁 格式为 include 引用文件名 c 的程序是

随机推荐

  • 5种CSS3鼠标悬停图片显示文字信息

    下载地址 5种CSS3鼠标悬停图片显示文字信息是一款鼠标悬停特效 含5种不同风格的鼠标悬停图片显示文字信息 dd
  • 用Double-DQN方法解决简单迷宫寻路问题

    环境描述 25 25离散的栅格图 起点左上角 终点右下角 障碍物1 1随机分布 动作空间维度2 向右 向下 每次移动奖励 1 遇到障碍物或移动出环境奖励 100 到终点奖励20 注 针对这个任务期望SARSA Q learning等方法能够
  • Android中控件AutoCompleteTextView的使用方法和一些属性

    版权声明 本文为博主原创文章 未经博主允许不得转载 AutoCompleteTextView一些属性
  • “数据压缩实验之LZW 编解码算法实现与分析”实验报告_201810413045_陈诚

    文章目录 1 实验项目名称 2 实验目的 3 什么是LZW编解码算法与它的原理 3 1 LZW编解码算法介绍 3 2 LZW编解码算法原理 3 2 1 编码流程图及为了便于理解和期末复习举实例说明 3 2 2 解码流程图及举实例说明 重点说
  • 并发无锁队列学习之一

    Anker 工作学习笔记 关注云计算 网络安全 软件定义网络 博客园 新随笔 管理 随笔 169 文章 2 评论 403 并发无锁队列学习之一 开篇 1 前言 队列在计算机中非常重要的一种数据结构 尤其在操作系统中 队列典型的特征是先进先出
  • SDUc++课结课大作业:基于qt类库c++实现简单的音乐播放器

    2021年11月的项目 版本一 功能简单 UI界面难看 代码架构拉跨 没有核心内容 技术含量低 2022年6月21日准备重构一下代码 让架构清晰一点 加点多线程和网络通信的内容 然后这次打算在visual studio下开发了 因为之前把那
  • 【零基础学QT】第八章 文件操作,网络文件传输实验

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏目录 零基础学QT 文章导航篇 专栏资料 https pan baidu com s 192A28BTIYFHmixRcQwmaHw 提取码 qtqt 点
  • java通过ssh远程调用服务器

    1 在大数据时代 服务器使用的频率难免上升 工作中难免会出现频繁使用的时候 有些场景不方便切换到服务器去操作 比如调用一个服务器的命令 但是要在程序里执行 当然不能手动去执行啦 所以java调用ssh就尤为重要 首先 添加maven依赖
  • Visual Stdio调试IDAPython脚本

    1 安装VS插件PTVS 这一步与第2步中安装版本应该一致 否则最后调试时会连不上 https github com Microsoft PTVS 2 安装python模块PTVSD pip install ptvsd 3 写如下代码ptv
  • SQL注入绕waf(安全狗)

    SQL注入绕waf 前言 感觉自己注入绕waf有点拉跨 于是自己搭建了一个环境练习绕waf 环境 我是用phpstudy sql lib 安全狗最新版本 正常访问 恶意语句 被拦截 注入检测 首先进行注入检测 判断是否有注入 id 1 直接
  • MyBatis基础知识

    MyBatis 优点 支持自定义 Sql 存储过程以及高级映射 MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作 MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型 接 口和 Java POJO Pl
  • 分支循环语句练习和友尽模拟器的综合应用

    目录 一 循环语句练习 1 计算 n的阶乘 2 计算 1 2 3 10 二 分支循环综合练习 3 在一个有序数组中查找具体的某个数字n 4 编写代码 演示多个字符从两端移动 向中间汇聚 5 编写代码实现 模拟用户登录情景 并且只能登录三次
  • MATLAB符号变量的创建和简单运算

    声明 本文章中数据来自清风老师数学建模课程 文章目录 MATLAB符号变量的创建和简单运算 1 符号变量 1 1 符号变量的创建 1 2 符号方程的创建 3 符号矩阵的创建 2 符号运算 2 1 简单运算 2 2 表达式的整理 2 3 因式
  • 我只是不甘心-------Day51

    回老家一天 完全断网 天气也配合的很给力 水蓝色的天 有白色的云 仰起头 看不到刺目的光却仍然眼睛生疼 不得不眯起眼 我努力想睁 却像有泪要流出来 不是揉不进沙子 却是容不下更多 去看了自家弟弟的新房子 空间很大 方方正正的百十个平方 特别
  • linux ops_使用OPS在现有Linux应用程序中运行Unikernels

    linux ops Unikernels are an emerging deployment pattern that engineers are choosing over Linux and Docker because of the
  • Eclipse如何安装svn插件及使用

    Eclipse中使用SVN 此文章对Myeclipse同样适用 一 在Eclipse里下载Subclipse插件 方法一 从Eclipse Marketplace里面下载 具体操作 打开Eclipse gt Help gt Eclipse
  • centos6.4 常用文件指令

    本文转载自 http www 121ask com thread 5606 1 html centos彻底删除文件夹 文件命令 centos 新建 删除 移动 复制等命令 讲解 1 新建文件夹 mkdir 文件名 新建一个名为test的文件
  • ios内购报错status:21004

    1 本人java 不懂这段代码什么意思 和对接的ios同事解决问题时 说是加入了共享密码 然后传给我的data参数 到ios验证才通过的 返回了status 0
  • vue项目build打包时遇到 Cannot read property ‘compilation‘ of undefined 问题解决方法

    vue项目build打包时遇到 Cannot read property compilation of undefined 问题解决方法 参考文章 1 vue项目build打包时遇到 Cannot read property compila
  • android___android_log_print打印函数__源代码

    android端JNI的打印信息 include