要在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

#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();

}

测试结果:

java jni日志输出_java打印Jni层log相关推荐

  1. java 金字塔样式输出_Java打印金字塔(正实心、正空心,倒实心、倒空心),菱形...

    解题就干一件事:找j,k与i的关系(规律) */ public class PrintPyramid { public static void main(String[] args) { int n ...

  2. java 异常堆栈输出_打印Java异常堆栈信息

    背景 在开发Java应用程序的时候,遇到程序抛异常,我们通常会把抛异常时的运行时环境保存下来(写到日志文件或者在控制台中打印出来).这样方便后续定位问题. 需要记录的运行时环境包含两部分内容:抛异常时 ...

  3. linux java程序控制台日志输出

    控制台日志输出到nohup.out文件中 nohup java -jar xx.jar>nohup.out 2>&1 & 不保存控制台日志 nohup java -jar ...

  4. java生成日志文件_java - 把日志生成到指定目录

    1.按天小时生成日志文件 log4j.appender.ruiming.DatePattern='_'yyyy-MM-dd-HH 2.最大日志文件数据 log4j.appender.ruiming.M ...

  5. java查看日志命令_Java程序员必备:查看日志常用的linux命令

    前言 趁周末,复习一下鸟哥的linux私房菜,看了文件内容查阅部分,做个笔记,哈哈,希望对你有帮助哦. cat cat : 由第一行开始显示文件所有内容 参数说明cat[-AbEnTv] 参数: -A ...

  6. java 不换行输出_java的输入输出

    0x01:输出流 java常用的输出语句有下面三种: System.out.println();//换行打印,输出之后会自动换行 System.out.print();//不换行打印 System.o ...

  7. java调用可执行程序 开销_java – 进行JNI调用的定量开销是多少?

    快速分析器测试产量: Java类: public class Main { private static native int zero(); private static int testNativ ...

  8. java解析日志数据_Java实时监控日志文件并输出的方法详解

    Java实时监控日志文件并输出的方法详解 想在前台显示数据同步过程中产生的日志文件,在网上找到解决方案,做了代码测试好用.这里做个记录 java.io.RandomAccessFile可以解决同时向文 ...

  9. java调C接口_java通过jni调用C程序接口

    打算写一个FbSetApp去操作framebuffer的设备文件,以便能够去设置FB的一些参数. 新建两个class FbParams.java: package org.trident.fbset; ...

最新文章

  1. SAP MM 模块调研问卷样例
  2. Flashtext:大规模数据清洗的利器
  3. Linux SPI总线设备驱动模型详解
  4. C++ primer三章二节标准库类型string
  5. Vue3 高级语法(二)—— 自定义指令、Teleport、Vue插件
  6. 代码生成工具随笔(2) ---我的生成工具
  7. python画太极八卦图_太极八卦图的正确画法
  8. IIS服务在启动默认网站(停止)时显示发生意外错误0x8ffe2740,
  9. Android 爆发病毒,华米 OV 均受影响;微信宣战百度搜索;抖音遭约谈 | CSDN极客头条...
  10. idea code key study form qinChao
  11. 计算机毕业论文降重,湖南计算机专业毕业论文英文摘要,财务管理专业硕士毕业论文降重...
  12. java窗口连接_JAVA简单的注册窗口(连接数据库)
  13. 读书笔记 | 4.3 基于征信系统的征信基础产品
  14. LTE(4G) ATTACH流程
  15. 红米NOTE3 双网通(2015617)刷机包 解账户锁
  16. 韩信点兵--中国剩余定理
  17. 微信公众号二次开发可以做哪些功能?
  18. 打条码软件怎样测试到纸张大小,条码标签纸规格有哪些?如何在打印机上设置打印尺寸?...
  19. 7 call和ret指令
  20. 【vue3】 vue3 几款值得推荐的UI组件库

热门文章

  1. 二进制 |_元二进制搜索| 单边二元搜索
  2. oracle 微信公众号,关于微信公众号贴代码的方法
  3. java需要会的工具_Java开发者必备的几款工具,一定要掌握!
  4. 在Ruby中使用&运算符(new_array- arr&old_Array)创建数组实例
  5. 详解4种经典的限流算法
  6. 实战:Redis 集群模式(下)
  7. 经典面试题SALES TAXES思路分析和源码分享
  8. 2021年广州如何申请失业补助金最全攻略
  9. 故障error: failed to run Kubelet: failed to create kubelet: misconfiguration: kubelet cgroup driver: “
  10. 第五人格服务器维修中怎么进,第五人格进不去怎么办 游戏进不去解决方法详解[多图]...