【Android NDK编程--- C/C++中使用LOG输出进行跟踪】【转载】_jni c++ log-程序员宅基地

技术标签: c++  c语言  android  Android  

前言

前面的文章我们基本已经把NDK的基本应用全部讲完了,我们在JAVA的调试中经常会用到Log.i什么的方法进行输出跟踪,这一篇我主要来说一下在NDK开发中,C++的代码中怎么实现日志输出。

实现方法

  1. 在c++文件中引用android/log.h头文件。
  2. 头文件中__android_log_print方法就是我们的日志输出方法。
  3. 通过#define的宏定义组装我们的__android_log_print方法。
  4. 在想输出日志的地方直接进行输出即可。
  5. 追加相关库liblog.so【cmakelist 这样添加 target_link_libraries(appOrlibName log) 】

代码实现

我们还是用原来的那个Demo程序,按照我们的实现方法来进行


在c++文件中引用android/log.h头文件

我们打开native-lib.cpp文件,在顶部加入引用android/log.h,如下图


通过#define的宏定义组装我们的__android_log_print方法

代码为:

#define LOG_TAG "System.out"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

在想输出日志的地方直接进行输出即可

我们直接在上一章的两个数相乘的方法中进行日志输出看看结果,改造一下

extern "C"
JNIEXPORT jint JNICALL
Java_dem_vac_vaccaendk_MainActivity_plusFromJNI(JNIEnv *env, jobject instance, jint a, jint b) {

    //首先获取class,这里传入的参数jobject是代表了Mainactivity,所以我们要自己查找
    jclass jcls=env->FindClass("dem/vac/vaccaendk/VaccaeJNI");
    if (jcls == NULL) {
        return 0;
    }

    //获取方法
    jmethodID jmethod = env->GetMethodID(jcls, "Plus", "(II)I");
    if(jmethod==NULL) {
        return 0;
    }

    //输出传入的a和b参数
    LOGI("a=%d",a);
    LOGI("b=%d",b);

    //调用访法
    //第一个参数为jobject的这是传入的是jobject是Mainactivity,
    //如果在CallIntMethod里面直接用传入的肯定会出错,因为我们的
    //方法是在VaccaeJNI的类里面,所以我们首先要实例化那个类,再调用
    jobject jobj = env->AllocObject(jcls);
    jint retint = env->CallIntMethod(jobj, jmethod, a, b);

    //输出调用相乘方法得到的结果
    LOGI("result=%d",retint);

    return retint;
}


接下来我们看一下运行后的结果

从上图中我们可以看到,在Logcat的日志中已经输出我们每一步的输出,这样在调试C/C++的代码中可以通过输出方式找到哪一步出的问题,方便我们开发,提高效率。

原文链接:

Android NDK编程(番外篇)--- C/C++中使用LOG输出进行跟踪-腾讯云开发者社区-腾讯云 (tencent.com)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/j8267643/article/details/136379630

智能推荐

计算机的外围设备简介_计算机外围固定-程序员宅基地

文章浏览阅读6.1k次,点赞3次,收藏5次。外围设备介绍计算机的外围设备(简称外设)虽然很多,但按功能分大类只有四类:输入、输出、存储、网络通讯。有些专业计算机需要的外围设备也不尽相同,并不都需要这四类外围设备。外围设备可以按需要组装,有些专业计算机甚至可以将存储设备和主芯片集成到一片芯片上,从而不再需要外加存储设备。最早的计算机(那时还只能称为计算器,只能做简单运算,如ABC机和ENIAC机)输入只是一些拨码开关,只能输入数字(还得是二进_计算机外围固定

java 图片中加文字_java怎么在图片上加文字-程序员宅基地

文章浏览阅读1.5k次。java 图片中加文字_java怎么在图片上加文字

GBase8cGDCA认证模拟题题库(三)_如果需要打开delete语句的审计功能,需要开启下面哪个参数-程序员宅基地

文章浏览阅读720次,点赞20次,收藏6次。B 选项,在创建模式时,可以不指定模式名。C 选项,兼容模式可选值为 AB、C、PG.安装GBase 8c分布式集群时所需的配置文件gbase.yml,在解压GBase8cV5 S3.0.0BXX CentOS x86 64.tar.bz2压缩包生成的目录中得到。真值的有效文本值是: TRUE、t、"true'、y、yes'、"1'TRUE'、true、整数范围内1~2^63-1、整数范围内-1~-2^63。GBase 8c 使用create table 创建表时,不指定参数,默认是astore,行存表。_如果需要打开delete语句的审计功能,需要开启下面哪个参数

xml文件中几个名词_xml文件里面的名词-程序员宅基地

文章浏览阅读334次。1 xmlns是XML Namespaces的缩写,中文名称是XML(标准通用标记语言的子集)命名空间。 web-app是web.xml的根节点标签名称 version是版本的意思 xmlns是web.xml文件用到的命名空间 xmlns:xsi是指web.xml遵守xml规范 xsi:schemaLocation是指具体用到的schema资源_xml文件里面的名词

【OpenGL】中点圆、椭圆生成算法_用setpixel函数中点画圆算法代码c++-程序员宅基地

文章浏览阅读1.6w次,点赞12次,收藏69次。OpenGL 中点圆、椭圆生成算法_用setpixel函数中点画圆算法代码c++

HTML-CSS实现背景图片出现不同的位置_css背景图高度占据一半另一半有别的背景色-程序员宅基地

文章浏览阅读2.1k次。首先在HTML中写入div,命名为img,在这个div中加入一个span标签并命名为img-bg和img50(5星为50).<div class="img"> <span class="img-bg img50"></span> <span class="img-bg img45"></span> <span class="img-bg img40"></span> </div> 在css代码._css背景图高度占据一半另一半有别的背景色

随便推点

Android MPAndroidChart:动态添加统计数据线【8】_android 动态统计-程序员宅基地

文章浏览阅读3.9k次。Android MPAndroidChart:动态添加统计数据线【8】本文在附录相关文章6的基础上,动态的依次增加若干条统计折线(相当于批量增加数据点)。布局文件:

vmware中的linux虚拟机如何增加磁盘容量_linux虚拟机磁盘空间不足-程序员宅基地

文章浏览阅读6.3k次。vmware中 centos的磁盘大小 20G->30G现象:fdisk -l可以看到增大后的磁盘总量,但是需要增加分区并格式化然后挂载才能使用.一、vmware中的设置先关闭虚拟机vm->settings->hard disk->utilities->expand->输入大小(增加后的大小)二、启动虚拟机,进入命令行1、 fdisk /dev/sda进入命令行Comman_linux虚拟机磁盘空间不足

Hadoop2.7.3下Mysql8.0下Hive2.3.8的安装_hive2.3.8安装-程序员宅基地

文章浏览阅读927次。hive安装前提:1.基于hadoop2.7的完全分布式集群搭建完成hadoop2.7集群搭建2.MySQL8.0安装完成 安装centos7上MySQL8.0Hive2.3.8的安装下载链接:https://mirrors.tuna.tsinghua.edu.cn/apache/下滑找到hive点击进去点击hive2.3.9(hive2.3.9和hive2.3.8差别不大)下载画红线的也就是bin.tar.gz后缀的hive解压安装下载完成后通过xftp传到虚拟机上(基操不在赘述)_hive2.3.8安装

The‘grub-efi-amd64-signed‘ package failed to install into /target/. Without the GRUB boot loader,_the grub-efiamd64-signed' package failed to instal-程序员宅基地

文章浏览阅读430次,点赞8次,收藏4次。在进行安装的时候有一个是否联网的选择,选择链接网络,则在安装的时候,可以看到在安装过程中,它会主动下载grub-efi-amd64-signed' package,确确实实,我在安装详情里看到了它有这个的download过程以及update过程。_the grub-efiamd64-signed' package failed to install intotarget without the g

从零开始用 Python 构建一个简单的神经网络_从零开始搭建神经网络-程序员宅基地

文章浏览阅读451次。n_learn_data = int ( n_samples * 0.8 ) # 80% 的可用数据点 learn_data , test_data = samples [: n_learn_data ], samples [ - n_learn_data :] learn_labels , test_labels = labels [: n_learn_data ], labels [ - n_learn_data :]_从零开始搭建神经网络

PAT乙级-题解(Java)_找工作pat乙级-程序员宅基地

文章浏览阅读1.4k次。我的题解放在github仓库了(喜欢的话,记得star哈)下面是汇总导航,如果你只想看其中某个题的话,点击题解直达。乙级的题目每个题都是一个有趣的故事,引导你去思考解决问题的能力,不是单纯的刷题。然后只涉及数组,循环,判断,字符串等基础编程语言语法的知识,不会设计复杂的算法与数据结构。一开始可能会有点吃力,正常,但是如果你全部刷完,leetcode上部分简单题对你来说是小case了。甲级主要是算法与数据结构,乙级刷完了,也可刷甲级, 甲级的题目特别好,测试用例丰富如果是急需找工作,面试的话刷lee_找工作pat乙级