java jni日志输出_java打印Jni层log

要在java层打印c的log必须引入这个头文件的宏定义:

#ifndef __LOG#define __LOG#ifdef __cplusplusextern "C"{#endif#include

//宏定义类似java 层的定义,不同级别的Log LOGI, LOGD, LOGW, LOGE, LOGF。 对就Java中的 Log.i log.d

#define LOG_TAG "HelloJni" //这个是自定义的LOG的标识

//#undef LOG//取消默认的LOG

#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG, __VA_ARGS__)

#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG, __VA_ARGS__)

#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG, __VA_ARGS__)

#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG, __VA_ARGS__)

#define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,LOG_TAG, __VA_ARGS__)#ifdef __cplusplus

}#endif

#endif

分析一下:这里调用了系统的log文件 #include

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

#ifndef _ANDROID_LOG_H#define _ANDROID_LOG_H#include#ifdef __cplusplusextern "C"{#endif

/** Android log priority values, in ascending priority order.*/typedefenumandroid_LogPriority {

ANDROID_LOG_UNKNOWN= 0,

ANDROID_LOG_DEFAULT,/*only for SetMinPriority()*/ANDROID_LOG_VERBOSE,

ANDROID_LOG_DEBUG,

ANDROID_LOG_INFO,

ANDROID_LOG_WARN,

ANDROID_LOG_ERROR,

ANDROID_LOG_FATAL,

ANDROID_LOG_SILENT,/*only for SetMinPriority(); must be last*/} android_LogPriority;/** Send a simple string to the log.*/

int __android_log_write(int prio, const char *tag, const char *text);/** Send a formatted string to the log, used like printf(fmt,...)*/

int __android_log_print(int prio, const char *tag, const char *fmt, ...)#if defined(__GNUC__)#ifdef __USE_MINGW_ANSI_STDIO#if __USE_MINGW_ANSI_STDIO__attribute__ ((format(gnu_printf,3, 4)))#else__attribute__ ((format(printf,3, 4)))#endif

#else__attribute__ ((format(printf,3, 4)))#endif

#endif;/** A variant of __android_log_print() that takes a va_list to list

* additional parameters.*/

int __android_log_vprint(int prio, const char *tag,const char *fmt, va_list ap);/** Log an assertion failure and abort the process to have a chance

* to inspect it if a debugger is attached. This uses the FATAL priority.*/

void __android_log_assert(const char *cond, const char *tag,const char *fmt, ...)#if defined(__GNUC__)__attribute__ ((noreturn))

#ifdef __USE_MINGW_ANSI_STDIO#if __USE_MINGW_ANSI_STDIO__attribute__ ((format(gnu_printf,3, 4)))#else__attribute__ ((format(printf,3, 4)))#endif

#else__attribute__ ((format(printf,3, 4)))#endif

#endif;

#ifdef __cplusplus

}#endif

#endif /* _ANDROID_LOG_H */

View Code

这里面定义了log的优先级,并且log最终调用的都是__android_log_print(...)函数:

int __android_log_print(int prio, const char *tag, const char *fmt, ...)

{

va_list ap;charbuf[LOG_BUF_SIZE];

va_start(ap, fmt);

vsnprintf(buf, LOG_BUF_SIZE, fmt, ap);

va_end(ap);return__android_log_write(prio, tag, buf);

}

所以自己定义一个头文件,并且定义宏指令指向__android_log_print(...)。就可以调用了。

另外在 system/core/include/cutils/log.h 也有定义,但是有些没有,而且在#include 提示找不到。估计是版本变更了。但是原理是一样的。

下面是测试函数:

JNIEXPORT jint JNICALL Java_com_example_hellojni_MainActivity_test

(JNIEnv*env, jclass clazz){

LOGD("log.d Java_Log_test()");

LOGI("Log.i Java_Log_test()");return 0;

}

安卓测试程序:

public class MainActivity extendsActivity {static{

System.loadLibrary("HelloJava");

}privateButton btn_getString;privateTextView tv_content;

@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initUI();

setEvent();

}private voidsetEvent() {//TODO Auto-generated method stub

btn_getString.setOnClickListener(newOnClickListener() {

@Overridepublic voidonClick(View v) {//TODO Auto-generated method stub

tv_content.setText(getString());

test();

}

});

}private voidinitUI() {//TODO Auto-generated method stub

btn_getString =(Button) findViewById(R.id.btn_getString);

tv_content=(TextView) findViewById(R.id.tv_content);

}public static nativeString getString();public static native inttest();

}

测试结果:

2ff31164f7a3dfdeb602bfdc72e169a8.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Dubbo基本原理机制

分布式服务框架: 高性能和透明化的RPC远程服务调用方案SOA服务治理方案Apache MINA 框架基于Reactor模型通信框架,基于tcp长连接 Dubbo缺省协议采用单一长连接和NIO异步通讯, 适合于小数据量大并发的服务调用,以及服务消费者机器…

Dubbo是如何进行远程服务调用的?(源码流程跟踪)

首先会分析Dubbo是如何进行远程服务调用的,如果不了解dubbo的服务暴露和服务调用,请去看前两篇dubbo的文章,然后后面我还会说一下dubbo的SPI机制 当我们在使用reference 注解的时候,来调用我们的提供者的Service对象的时候&#…

Redis五种数据类型及应用场景

Redis五种数据类型及应用场景 MySqlMemcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的…

WebSocket介绍和Socket的区别

WebSocket介绍与原理 WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。一开始的握手需要借助HTTP)请求完成。 ——百度百科 目的:即时通讯,替代轮询 应用场景:网站上的即时通讯是很常见的&#xf…

WebSocket协议入门介绍

文章目录WebSocket协议是什么WebSocket是应用层协议WebSocket与Http的区别为什么要使用WebSocket如何使用WebSocket客户端API在客户端使用WebSocket在服务端使用WebSocket反向代理对WebSocket的支持WebSocket协议是什么 WebSocket是应用层协议 WebSocket是基于TCP的应用层协议…

远程ykvm 插件移值java_Centos7 命令行下kvm安装windows,linux

查看是否支持egrep "svm|vmx" /proc/cpuinfo |uniq安装软件yum install libvirt -yyum -y install qemu-kvmsystemctl enable libvirtd && systemctl start libvirtd# 启动libvitd服务查看 ip add #查看是否有 virbr0网卡 yum install virt-installcentos7 例…

php7.0扩展yac,php扩展之yac安装

git克隆$ git clone https://github.com/laruence/yac.git解压安装注意这里的php-config可能不一样查看php-config位置$whereis php编译安装$ cd yac$ phpize$ ./configure --with-php-config/usr/bin/php-config$ make$ make install修改php.ini,载入扩展,重启php-fpmextensio…

springboot+websocket实现服务端、客户端

一、引言 小编最近一直在使用springboot框架开发项目,毕竟现在很多公司都在采用此框架,之后小编也会陆续写关于springboot开发常用功能的文章。 什么场景下会要使用到websocket的呢? websocket主要功能就是实现网络通讯,比如说…

输出有样式的php,PHP导出带样式的Excel

工作中做导出的时候,需要导出自定义的表格或嫌弃导出的Excel格式太难看了。需要设置颜色、字号大小、加粗、合并单元格等等。Paste_Image.pngPHP代码:php/**导出文件return string*/public function export(){$file_name "成绩单-".date(&quo…

idea创建多模块Springboot项目、导入多模块、删除多模块

前言 在eclipse中有Workspace(工作空间)和 Project(工程)的概念在 IDEA中只有 Project(工程)和 Module(模块)的概念。这个地方刚开始用的时候会很容易理不清它们之间的关系。在eclip…

包含内部类的.java文件编译后生成几个.class文件

如果一个类有内部类,编译将生成几个字节码文件,规则是怎样呢? 写在前,自己动手丰衣足食,结论只有个人实验支持,没有官方数据支持,欢迎自行查阅文档然后来指正,轻喷,谢谢…

Intellij IDEA远程debug教程实战和要点总结

远程调试,特别是当你在本地开发的时候,你需要调试服务器上的程序时,远程调试就显得非常有用。 JAVA支持调试功能,本身提供了一个简单的调试工具JDB,支持设置断点及线程级的调试同时,不同的JVM通过接口的协…

Idea进行远程Debug

Idea远程调试 当把一个本地项目部署到远程服务器后有可能出现意想不到错误,这个时候通过远程调试能够更清楚的找到bug所在位置。本篇主要讲解如何使用Idea开发工具 进行调试1.远程调试服务器上面的SpringBoot 项目2.远程调试服务器上运行在tomcat中的项目&#xff…

matlab表示DFT和DTFT,【 MATLAB 】离散傅里叶级数(DFS)与DFT、DTFT及 z变换之间的关系...

上篇博文我们简单的讨论了离散傅里叶级数DFS和离散傅里叶变换DFT之间的关系,简单地说,DFT就是DFS在一个周期内的表现。为了后面讨论方便,这里给出DFS的系数公式(分析公式):(1) 其中:综合公式:(2) 为了对比&…

php分列显示,【杂谈】PHP数组怎样按键名完成降序分列

PHP关联数组按键名完成降序分列,我们能够直接经由过程PHP中的krsor()函数来完成。krsort函数示意对数组根据键名逆向排序。那末在前面的文章中,已给人人引见过PHP关联数组按键名完成升序分列的要领。下面我们继承连系简朴的示例,给人人引见PH…

spike 序列matlab,SPKtool1.0.1 神经信号spike 分类及处理 工具包 matlab 238万源代码下载- www.pudn.com...

文件名称: SPKtool1.0.1下载收藏√ [5 4 3 2 1 ]开发工具: matlab文件大小: 937 KB上传时间: 2013-03-05下载次数: 3提 供 者: 无语详细说明:神经信号spike 分类及处理 工具包-A toolbox for neurophysiological data processing文件列表(点击判断是否您需要的…

cuda加速求解龙格库塔四阶五步积分

一般代码使用cuda加速的方法: 使用PyTorch进行加速: 首先,你需要将你的ODE系统定义为PyTorch模型,这样可以利用PyTorch的自动微分功能和GPU加速。然后,你需要将数据和参数转换为PyTorch张量,并将它们移动到…

Idea怎么实现画类图

1.【file】-【Settings】-【Tools】-【Diagrams】-勾选Java Class Diagram的选项 2.右击类,【Diagrams】-【Show Diagram】

如何在linux下创建一个可运行shell脚本?

linux系统下,经常会用到自启动脚本,那么如何新建一个自启动脚本? 工具/原料 linux系统 方法/步骤 1 新建一个.sh文件,touch test.sh 2 编辑test.sh文件,vi test.sh 然后键入i,输入内容, #!…

TCP 协议(包含三次握手,四次挥手)

文章目录1.确认应答机制 (ACK)2.超时重传3.1建立连接 - 三次握手 ▲3.2.断开连接 - 四次挥手 ▲1.确认应答机制 (ACK) 确认应答是可靠传输的最核心机制 接收方反馈一个应答报文(ACK),表示已收到 假设现在 A 想去 B 家里玩游戏,于是 A 给 B 发消息&…