Android深入系统完全讲解(40)

news2025/1/4 19:16:33
  1. 调试 C 代码
    15.1 改成 C 写法
    这个没啥必要,但是对 C 比 C++ 情谊深的我,把它修改了。下面是修改的一部分代码,
    把 C++ 的写法,改成 C 的,同时修改引入头文件。
    jstring
    Java_hellojni_codegg_com_hellojni_MainActivity_stringFromJNI(JNIEnv *env,
    jobject thiz) {
    char *hello = “Hello from C++”;
    return (*env)->NewStringUTF(env, hello);
    }
    15.2 配置调试参数
    点击菜单栏上面的 Run | Run/Debug Configurations ,选择 Debugger 菜单的 Debug type 为
    Dual。

在这里插入图片描述
设置成可以同时调试 Java 和 C 的代码。
15.3 调试
在 C 代码中 Java_hellojni_codegg_com_hellojni_MainActivity_myStringFromJNI 设置断
点.Debug 运行 App ,可以看到断在了我们设置的断点位置生效了。

在这里插入图片描述
剩下的就是单步调试,查看变量,查看堆栈信息了。
16. C 调用 Java
经过十来节的学习,我们走过了 NDK 、 CMake 配置,编译 so 、 ELF(可执行文件),
学会使用 Android Studio 调试 C 源码。同时我们在学习实战的过程中,也了解了 JNI 的实
现原理,编译中参数如何配置,怎么查找。并且如果你想去看编译过程,给出了目录。
我们已经学会了 Java 调用 C 的方式,下一步我们就学习如何从 C 调用到 Java 。
我们这一节演示一个内容,如何在 C 代码中调用 Java 的方法,以及属性值。我们实现一
个,在 C 里面,找到 Java 中的两个变量,然后再调用 Java 的一个方法,让返回两数的相
加结果,传回给 Java ,显示出来。
16.1 MainActivity.java 新增一些代码
//两个变量,等会 C 中会读取这两个值
int i = 5;
int n = 10;//返回相加结果,等会 C 会调用这个方法
public int add(int num1, int num2) {
return num1 + num2;
}
//从 C 端获取结果
public native int myResultFromJNI(); 然后选中我们的 myResultFromJNI 方法,点击右键,选择生成.h by javah
16.2 native-lib.c 实现方法:
JNIEXPORT jint JNICALL
Java_hellojni_codegg_com_hellojni_MainActivity_myResultFromJNI
(JNIEnv *env, jobject obj) {
//获致 obj 中对象的 class
jclass clazz = (*env)->GetObjectClass(env, obj);
// 获取 java 中 i 字段的 ID(最后一个参数是 i 的签名)
jfieldID id_num1 = (*env)->GetFieldID(env, clazz, “i”, “I”);
// 获取 num1 字段对应的值
jint num1 = (*env)->GetIntField(env, obj, id_num1);
jfieldID id_num2 = (*env)->GetFieldID(env, clazz, “n”, “I”);
// 获取 num2 字段对应的值
jint num2 = (*env)->GetIntField(env, obj, id_num2);
//拿到 add 方法的 id,后面的为签名信息,括号内代表两个参数,都是 I (int)返回也为 I(int)的方

jmethodID methodId = (*env)->GetMethodID(env, clazz, “add”, “(II)I”);
// 调用它,拿到结果jint res = (*env)->CallIntMethod(env, obj, methodId, num1, num2);
return res;
}
关于参数签名,该如何编写,这里不展开讲解,提供一篇链
接 https://www.jianshu.com/p/c85462c3a26e

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

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

相关文章

Java基础41 面向对象(高级)

面向对象(高级)一、类变量和类方法1.1、static (类变量)1.1.1 关于static的存放位置1.1.2 类变量使用细节及注意事项1.2、类方法1.2.1、类方法使用细节及注意事项二、main方法2.1、深入理解main方法三、代码块3.1、代码块的基本介…

19.6、Javaweb_案例旅游路线收藏功能

旅游线路收藏功能 分析 判断当前登录用户是否收藏过该线路 当页面加载完成后,发送ajax请求,获取用户是否收藏的标记 根据标记,展示不同的按钮样式 编写代码 后台代码 RouteServlet: package cn.itcast.travel.web.servlet;…

【Typescript学习】使用 React 和 TypeScript 构建web应用(四)useReducer、扑街了的分区功能【完结了】

教程来自freecodeCamp:【英字】使用 React 和 TypeScript 构建应用程序 跟做,仅记录用 其他资料:https://www.freecodecamp.org/chinese/news/learn-typescript-beginners-guide/ 作者提供的源码https://github.com/piyush-eon/react-typescr…

机器学习【西瓜书/南瓜书】--- 第四章决策树

一、决策树理论分析 1.1 通俗理解 决策树是一种非常经典的机器学习算法,通俗理解的话我们可以举一个例子,比如现在别人要找你借钱,那么按照首先是不是要判断你和他的关系如何?如果关系不好,我就直接拒绝他。如果关系很好&#…

Python机器学习:一元回归

→\rightarrow→回归效果评价 🌕 一元回归 一元回归主要研究一个自变量和一个因变量之间的关系,而这个自变量和因变量之间的关系又可分为线性回归和非线性回归。 ⭐️ 一元线性回归分析两个变量之间的线性关系,如ykxbykxbykxb中xxx和yyy就是…

深度学习笔记:神经网络的学习(1)

机器学习的核心在于从数据中提取规律和特征,并用于分类或预测。对于识别手写数字,如果人工设计一个识别算法逻辑是十分困难的。一种方法是任务在数据中提取更重要的特征量,然后利用机器学习算法如SVM或KNN。而神经网络的方法则是完全由机器自…

ISIS的3级别(level-1、level-2、level-1-2)4大类(IIH、LSP、CSNP、PSNP)9小类与邻接关系建立LSP交互过程介绍

2.2.0 ISIS 4种报文类型IIH、LSP、CSNP、PSNP、邻居建立过程、交互LSP过程 ISIS的3级别4大类9小类 ISIS拥有3种级别的路由器,分别是level-1、level-2、level-1-2。 不同级别之间进行交互的报文也是有所区别的,常规的ISIS报文分有4大类:IIH、…

cubeIDE开发, stm32人工智能开发应用实践(Cube.AI).篇一

一、cube.AI简介及cubeIDE集成 1.1 cube.AI介绍 cube.AI准确来说是STM32Cube.AI,它是ST公司的打造的STM32Cube生态体系的扩展包X-CUBE-AI,专用于帮助开发者实现人工智能开发。确切地说,是将基于各种人工智能开发框架训练出来的算法模型&#…

Vue3商店后台管理系统设计文稿篇(六)

记录使用vscode构建Vue3商店后台管理系统,这是第六篇,从这一篇章开始,所有的预备工作结束,正式进入商店后台管理系统的开发 文章目录一、创建后台管理系统的标题栏二、安装Icon 图标三、创建Menu菜单正文内容: 一、创…

PowerShell 学习笔记:操作JSON文件

JSON文件(字符串)是有一定格式要求的文本文件。百度百科JSON(JavaScriptObject Notation, JS对象简谱)是一种轻量级的数据交换格式。它基于 ECMAScript(European Computer Manufacturers Association, 欧洲计算机协会制…

初识Linux常见指令汇总

文章目录前言1.对文件或目录的常用指令1.查看当前路径下的文件或目录相关信息2.进入指定路径3.创建删除文件或者目录4.使用nano简单编辑文件查看文件属性5.复制移动重命名文件或目录6.输入输出重定(查看文件内容)向和搜索查找1.输入输出重定向2.搜索查找7.打包压缩文件2.时间相…

如何使用Maven构建Java项目?Maven的使用详细解读

文章目录1. 前言2. Maven 快速入门2.1 Maven 项目模型2.2 Maven 仓库3. Maven的安装配置3.1 安装3.2 配置环境变量3.4 Maven 配置4. Maven 的常用命令4.1 编译4.2 清理4.3 打包4.4 测试4.5 安装5. Maven生命周期6. 总结Java编程基础教程系列:1. 前言 在 Java 开发中…

C++初阶:list类

文章目录1 list介绍2 list的模拟实现2.1 类的定义2.2 默认成员函数2.2.1 构造函数2.2.2 析构函数2.2.3 拷贝构造2.2.4 赋值重载2.3 迭代器2.3.1 正向迭代器2.3.2 反向迭代器2.4 修改接口2.4.1 任意位置插入2.4.2 任意位置删除2.5 其他接口2.5.1 尾插2.5.2 头插2.5.3 尾删2.5.3 …

3.7-2动态规划--图像压缩(举例子和写代码)

3.7动态规划--图像压缩_昵称什么的不存在的博客-CSDN博客 问题描述(再写一遍) 这篇文章是接着上面这一篇写的,就是写一个例子方便理解,模拟填写数组的过程 l: l[i]存放第i段长度, 表中各项均为8位长,限制了相同位数的…

CGAL 点云精配准之ICP算法

文章目录 一、简介二、相关参数三、实现过程三、举个栗子四、实现效果参考资料一、简介 ICP算法总共分为6个阶段,如下图所示: (1)挑选发生重叠的点云子集,这一步如果原始点云数据量比较巨大,一般会对原始点云进行下采样操作。 (2)匹配特征点。通常是距离最近的两个点,…

如何批量增加视频的音量(ffmpeg)

问题背景 由于之前爷爷的唱戏机充不进去电,过年时给爷爷买了个新的。但这个新买的机子,它的曲目(视频)在U盘里,声音普遍较低,我爷爷的耳朵不好,声音需要比正常的声音调大一些。 在Videolouder这…

【数据结构和算法】认识线性表中的链表,并实现单向链表

本文接着上文,上文我们认识了线性表的概念,并实现了静态、动态顺序表。接下来我们认识一个新概念链表。并实现单向链表的各种操作。顺序表还有不明白的看这一篇文章 (13条消息) 【数据结构和算法】实现线性表中的静态、动态顺序表_小王学代码的博客-CSDN…

leetcode--链表

链表1.链表的基本操作(1)反转链表(206)(2) 合并两个有序链表(21)(3)两两交换链表中的节点(24)2.其它链表技巧(1)相交链表(160)(2)回文链表(234)3.练习&#x…

力扣 2293. 极大极小游戏

题目 给你一个下标从 0 开始的整数数组 nums ,其长度是 2 的幂。 对 nums 执行下述算法: 设 n 等于 nums 的长度,如果 n 1 ,终止 算法过程。否则,创建 一个新的整数数组 newNums ,新数组长度为 n / 2 &…

手把手带初学者快速入门 JAVA Web SSM 框架

博主也是刚开始学习SSM,为了帮大家节省时间,写下SSM快速入门博客 有什么不对的地方还请 私信 或者 评论区 指出 ​只是一个简单的整合项目,让初学者了解一下SSM的大致结构 项目先把框架写好,之后在填写内容 项目压缩包 完整的蓝奏…