Android Native Code开发学习(二)JNI互相传参返回调用
Android Native Code开发学习(二)
本教程为native code学习笔记,希望能够帮到有需要的人
我的电脑系统为ubuntu 22.04,当然windows也是可以的,区别不大
一、native code介绍
native code就是在android项目中混合C++或者C语言进行开发,这样的好处是很多底层的东西需要使用C++/C的语言进行操作,而且在android开发中,使用C++和C混合开发能够大大增强逆向的难度,同时还能提升程序运行的效率,毕竟C++/C的效率不是其他语言能比得上的。
二、NDK的开发流程
1.声明native方法
首先我们要先在你android的java文件中进行一个声明,声明的格式是这种
public native String stringFromJNI();
当然也可以加上参数
public native String stringFromJNI(String str);
然后我们在android activity中调用这个函数
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding = ActivityMainBinding.inflate(getLayoutInflater());setContentView(binding.getRoot());// 我们调用这个方法,并且使用TextView显示出来TextView tv = binding.sampleText;tv.setText(stringFromJNI("我宣布个事"));}
2.实现这个方法
在生成的cpp文件中我们添加以下代码
#include <jni.h>
#include <string>extern "C" JNIEXPORT jstring JNICALL
Java_com_example_nativecodelearn_MainActivity_stringFromJNI(JNIEnv* env,jobject /* this */, jstring str) {char* str_cpp =(char *)env ->GetStringUTFChars(str,NULL); // 我们首先要读取出来这个char* str_cpp_2 = "我是个大可爱";strcat(str_cpp,","); // 合并起来strcat(str_cpp,str_cpp_2);return env->NewStringUTF(str_cpp); // 格式需要转成UTF
}
下面我们介绍一下上面出现的参数
**JNIEnv*😗*这个鬼东西是一个指向JNI环境的指针,可以通过它来访问JNI提供的接口方法;
**jobject:**表示Java对象中的this
**JNIEXPORT,JNICALL:**这是JNI定义的宏。可以在jni.h中找到。
还有一个东西就是jstring,这个代表的是java文件中的string类型,就是在这种情况下我们我们是需要一一对应的,比如用jint代表java中的int,具体对比可以去查相关资料。
3.编译安装运行
这样我们就将程序拼接起来,成功显示了我是个大可爱

三、JNI调用java方法
1.静态方法的调用
根据上文我们了解了如何进行java调用cpp的代码,下面我们就介绍如何在cpp中调用java代码。
如果是静态的java代码,cpp调用Java的基本步骤是先通过类名找到类,再根据方法名找到方法的id,最后就可以调用这个方法了。如果是非静态的,那么需要构造出类的对象后才可以调用。
下面我们开始介绍静态方法的JNI调用
首先新建一个类,并且创建一个静态的方法
public class JavaForJNI {public static String str_From_JNI(){System.out.println("java code running");return "全体目光向我看齐\n";}
}
下面就是要在cpp文件中调用这个方法了
#include <jni.h>
#include <string>extern "C" JNIEXPORT jstring JNICALL
Java_com_example_nativecodelearn_MainActivity_stringFromJNI(JNIEnv *env,jobject /* this */, jstring str) {char *str_cpp = (char *) env->GetStringUTFChars(str, NULL); // 我们首先要读取出来这个char *str_cpp_2 = "我是个大可爱";jclass java_class = env->FindClass("com/example/nativecodelearn/JavaForJNI");if (java_class == NULL) {printf("Class not found");}jmethodID id = env->GetStaticMethodID(java_class, "str_From_JNI", "()Ljava/lang/String;");if (id == NULL) {printf("MethodID not found");}jstring string_from_java =(jstring) env->CallStaticObjectMethod(java_class, id);char* string_2=(char *) env->GetStringUTFChars(string_from_java, NULL);printf("test in cpp");strcat(str_cpp, ","); // 合并起来strcat(str_cpp, str_cpp_2);strcat(string_2,str_cpp);return env->NewStringUTF(string_2); // 格式需要转成UTF
}
下面我们主要讲解一下cpp中的调用代码,首先就是要获取这个类,就是代码中
jclass java_class = env -> FindClass("com/example/nativecodelearn/JavaForJNI");
这一段主要就是指定好运行的类名,
jmethodID id = env->GetStaticMethodID(java_class, "str_From_JNI", "()Ljava/lang/String;");
这一段主要是用来获取类中的方法名,至于第三个参数是方法的签名,这个其实不需要去了解,一般android studio可以自动给你补全的。最后的话使用CallStaticObjectMethod调用,不过要注意返回值,至于返回值是一个类怎么处理,我们下一节讲。
如果返回是空的话直接调用CallStaticVoidMethod就可以了

2.非静态方法的调用
非静态方法调用相对比较麻烦,当然跟类有关的我们下一节再讲。
public String str_From_JNI_2(String string_from_cpp){return string_from_cpp+"\n谢谢各位!\n";}
调用方法为(这次只贴部分代码)
//查询类名
jclass clz = env->FindClass("com/example/nativecodelearn/JavaForJNI");
//查询构造函数的id
jmethodID jcmid = env->GetMethodID(clz, "<init>", "()V");
//创建对象
jobject jobject = env->NewObject(clz, jcmid);
//获取方法id
jmethodID jmeid = env->GetMethodID(clz, "str_From_JNI_2","(Ljava/lang/String;)Ljava/lang/String;");
//准备传入参数
jstring string_from_cpp = env->NewStringUTF(string_2);
//调用方法
jstring final_string=(jstring) env ->CallObjectMethod(jobject,jmeid,string_from_cpp);

这样我们就展示了互相传参与互相返回的使用方法与使用方式。希望这个博客可以帮到你。
相关文章:
Android Native Code开发学习(二)JNI互相传参返回调用
Android Native Code开发学习(二) 本教程为native code学习笔记,希望能够帮到有需要的人 我的电脑系统为ubuntu 22.04,当然windows也是可以的,区别不大 一、native code介绍 native code就是在android项目中混合C或…...
Ubuntu 下安装Qt5.12.12无法输入中文解决方法
Ubuntu 下安装Qt5.12.12无法输入中文解决方法 一,环境: (1)VMware Workstation 15 Pro (2)Ubuntu 20.04 (3)Qt 5.12.12 64bits (4)Qt Creator 5.0.2 &#…...
微信小程序左上角home图标的解决方法之一 层级混乱导致的home图标显示的问题 自定义左上角左侧图标的返回路径
这个项目的编辑页在tabbar上 导致跳到tabbar得使用wx.switchTab 保存后返回原来的页面就出现了左上角的home图标 本来想通过自定义home图标的跳转路径来解决这个问题 没想到居然找不到相关内容 有清楚的朋友麻烦给我留个言不胜感激 那我写一下我的骚操作 app.js globalData: {…...
Kubernetes(K8s 1.28.x)部署---超详细
目录 一、基础环境配置(所有主机均要配置) 1、配置IP地址和主机名、hosts解析 2、关闭防火墙、禁用SELinux 3、安装常用软件 4、配置时间同步 5、禁用Swap分区 6、修改linux的内核参数 7、配置ipvs功能 二、容器环境操作 1、定制软件源 2、安…...
spring高级源码50讲-20-36(springMVC)
文章目录 WEB20) RequestMappingHandlerMapping 与 RequestMappingHandlerAdapter演示1 - DispatcherServlet 初始化代码参考 收获💡演示2 - 自定义参数与返回值处理器代码参考 收获💡 21) 参数解析器演示 - 常见参数解析器代码参考 收获💡 2…...
Leetcode Top 100 Liked Questions(序号141~189)
141. Linked List Cycle 题意:给你一个链表,判断链表有没有环 我的思路 两个指针,一个每次走两步,一个每次走一步,如果走两步的那个走到了NULL,那说明没有环,如果两个指针指向相等&…...
网络编程day3-FTP客户端项目
FTP协议 FTP 的独特的优势同时也是与其它客户服务器程序最大的不同点就在于它在两台通信的主机之间使用了两条 TCP 连接,一条是数据连接,用于数据传送;另一条是控制连接,用于传送控制信息(命令和响应)&…...
音频母带制作::AAMS V4.0 Crack
自动音频母带制作简介。 使用 AAMS V4 让您的音乐听起来很美妙! 作为从事音乐工作的音乐家,您在向公众发布材料时需要尽可能最好的声音,而为所有音频扬声器系统提供良好的商业声音是一项困难且耗时的任务。AI掌握的力量! 掌控您…...
【SpringCloud】SpringCloud整合openFeign
文章目录 前言1. 问题分析2. 了解Feign3. 项目整合Feign3.1 引入依赖3.2 添加注解3.3 编写Feign客户端3.4 测试3.5 总结 4. 自定义配置4.1 配置文件方式4.2 Java代码方式 5. Feign使用优化5.1 引入依赖5.2 配置连接池 6. Feign最佳实践6.1 继承方式6.2 抽取方式 前言 微服务远…...
成集云 | 飞书审批同步金蝶云星空 | 解决方案
源系统成集云目标系统 方案介绍 飞书员工报销审批通过后,审批单据内容和审批状态实时同步金蝶云星空 飞书是字节跳动于2016年自研的新一代一站式协作平台,将即时沟通、日历、云文档、云盘和工作台深度整合,通过开放兼容的平台,…...
【计算机组成 课程笔记】3.2 算数运算和逻辑运算的硬件实现
课程链接: 计算机组成_北京大学_中国大学MOOC(慕课) 3 - 2 - 302-门电路的基本原理(11-39--)_哔哩哔哩_bilibili 现代计算机的CPU和其他很多功能部件都是基于晶体管的集成电路,想要了解计算机组成的基本原理,还是需要有…...
python元组的不可变性和应用场景
Python元组是一种不可变的数据类型,也就是说一旦创建后,其元素无法被修改、添加或删除。元组使用圆括号来表示,元素之间使用逗号进行分隔。 以下是创建和访问元组的方法和语法: 创建元组: 使用圆括号直接创建ÿ…...
配置化开发的核心设计 - Schema
前端配置化SchemaServerless FaaS BaaS useImperativeHandle() react-helmet 参考链接 schema进入...
HTTP协议概述
HTTP 协议定义 HTTP协议,直译为超文本传输协议,是一种用于分布式、协作、超媒体的信息系统的应用协议。HTTP协议是万维网数据通信的基础。HTTP协议在客户端-服务器计算模型中充当请求-响应协议。客户端向服务器提交HTTP请求消息。服务器提供HTML文件和其…...
fastjson2 打开 AutoType
1. 功能简介 FASTJSON支持AutoType功能,这个功能在序列化的JSON字符串中带上类型信息,在反序列化时,不需要传入类型,实现自动类型识别。 2. AutoType安全机制介绍 必须显式打开才能使用。和fastjson 1.x不一样,fast…...
封装(个人学习笔记黑马学习)
1、格式 #include <iostream> using namespace std;const double PI 3.14;//设计一个圆类,求圆的周长 class Circle {//访问权限//公共权限 public://属性//半径int m_r;//行为//获取圆的周长double calculateZC() {return 2 * PI * m_r;} };int main() {//通…...
PyTorch 模型性能分析和优化 - 第 3 部分
这[1]是关于使用 PyTorch Profiler 和 TensorBoard 分析和优化 PyTorch 模型主题的系列文章的第三部分。我们的目的是强调基于 GPU 的训练工作负载的性能分析和优化的好处及其对训练速度和成本的潜在影响。特别是,我们希望向所有机器学习开发人员展示 PyTorch Profi…...
【力扣每日一题】2023.9.1 买钢笔和铅笔的方案数
目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们三个数,一个是我们拥有的钱,一个是钢笔的价格,另一个是铅笔的价格。 问我们一共有几种买笔…...
实现不同局域网间的文件共享和端口映射,使用Python自带的HTTP服务
文章目录 1. 前言2. 本地文件服务器搭建2.1 python的安装和设置2.2 cpolar的安装和注册 3. 本地文件服务器的发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 数据共享作为和连接作为互联网的基础应用,不仅在商业和办公场景有广泛的应用…...
Kubernetes技术--k8s核心技术Pod
(1).概述 Pod 是 k8s 系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型。 k8s不会直接处理容器,而是 Pod,Pod 是由一个或多个 container 组成。 一个pod中的容器共享网络命名空间。 Pod是一个短暂存在的。 (2).为什么k8s中最小单元是…...
Video2X AI视频增强实用指南:零基础掌握高效画质提升解决方案
Video2X AI视频增强实用指南:零基础掌握高效画质提升解决方案 【免费下载链接】video2x A lossless video/GIF/image upscaler achieved with waifu2x, Anime4K, SRMD and RealSR. Started in Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Tr…...
软开关电路设计:从原理到实战,打造智能电源管理方案
1. 软开关电路设计基础 第一次接触软开关电路是在一个电池供电的智能门锁项目里。当时产品经理提了个需求:用户按下按键后设备要立即唤醒,但待机功耗必须控制在10μA以下。传统机械开关方案要么漏电流大,要么响应慢,直到我发现软开…...
如何快速掌握教学环境控制权:JiYuTrainer终极使用指南
如何快速掌握教学环境控制权:JiYuTrainer终极使用指南 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer 你是否曾经在计算机课堂上感到束手束脚?当老师开启全…...
YOLOv13开箱即用镜像体验:简单几步,完成你的第一个AI检测项目
YOLOv13开箱即用镜像体验:简单几步,完成你的第一个AI检测项目 1. 为什么选择YOLOv13官版镜像? 1.1 传统部署的痛点 在目标检测领域,YOLO系列一直是开发者的首选。但传统部署方式往往让人望而却步: 环境配置复杂&am…...
百度网盘提取码智能获取工具:3秒解锁任何分享资源的终极方案
百度网盘提取码智能获取工具:3秒解锁任何分享资源的终极方案 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾遇到过这样的场景?好不容易找到一个急需的学习资源,点击百度网盘链接后…...
DeerFlow自动化测试:基于Postman的API测试集成
DeerFlow自动化测试:基于Postman的API测试集成 1. 为什么需要API自动化测试 在微服务架构中,系统通常由多个独立的服务组成,这些服务通过API进行通信。手动测试这些API不仅耗时耗力,而且容易出错。随着系统规模扩大,…...
PROJECT MOGFACE镜像部署详解:针对STM32开发者的AI赋能入门
PROJECT MOGFACE镜像部署详解:针对STM32开发者的AI赋能入门 很多做嵌入式开发的朋友,尤其是玩STM32的,可能都动过接触AI的念头。但一看到那些复杂的Python环境、动辄几十G的模型文件、还有各种依赖冲突,头就大了。心想࿱…...
实战指南:用快马平台生成团队统一的homebrew环境配置脚本,保障协作无忧
最近在团队协作中遇到了一个头疼的问题:新成员加入时,光是搭建开发环境就要折腾一整天。不同成员的电脑上软件版本参差不齐,导致"在我机器上能跑"的经典问题频繁出现。经过一番摸索,我发现用homebrew配合bash脚本可以完…...
NUS-WIDE数据集实战:从原始文件到多模态数据集的完整预处理指南
1. NUS-WIDE数据集简介与下载指南 NUS-WIDE是一个经典的多标签图像数据集,由新加坡国立大学的研究团队构建。这个数据集包含了269,648个样本和81个类别,每个样本可能同时属于多个类别(这就是多标签的含义)。数据集最初是为了研究网…...
S2-Pro算法能力深度评测:在经典LSTM时间序列预测任务中的表现
S2-Pro算法能力深度评测:在经典LSTM时间序列预测任务中的表现 1. 评测背景与目标 时间序列预测一直是机器学习领域的经典难题,而LSTM作为处理序列数据的利器,被广泛应用于金融、气象、工业等领域。本次评测聚焦S2-Pro大模型在算法实现与优化…...
