泊头网站优化/营销策划公司名称
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中最小单元是…...

基于Springboot实现的Echarts图表
概述 ECharts是百度开源的一个前端组件。它是一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等)&…...

adb server version (41) doesn‘t match this client (39)
异常: adb server version (41) doesnt match this client (39); killing... ADB server didnt ACK安装ADB后:查看版本 $ adb version Android Debug Bridge version 1.0.39 Version 1:8.1.1-1r23-5.4-1eagle Installed as /usr/lib/android-sdk/platf…...

B080-RabbitMQ
目录 RabbitMQ认识概念使用场景优点AMQP协议JMS RabbitMQ安装安装elang安装RabbitMQ安装管理插件登录RabbitMQ消息队列的工作流程 RabbitMQ常用模型HelloWorld-基本消息模型生产者发送消息导包获取链接工具类消息的生产者 消费者消费消息模拟消费者手动签收消息 Work QueuesSen…...

关于岛屿的三道leetcode原题:岛屿周长、岛屿数量、统计子岛屿
题1:岛屿周长 给定一个 row x col 的二维网格地图 grid ,其中:gridi 1 表示陆地, gridi 0 表示水域。 网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰…...

lintcode 1081 · 贴纸拼单词【hard 递归+记忆化搜索才能通过】
题目 https://www.lintcode.com/problem/1081/ 给出N种不同类型的贴纸。 每个贴纸上都写有一个小写英文单词。 通过裁剪贴纸上的所有字母并重排序来拼出字符串target。 每种贴纸可以使用多次,假定每种贴纸数量无限。 拼出target最少需要多少张贴纸?如果…...

HarmonyOS/OpenHarmony(Stage模型)应用开发单一手势(二)
三、拖动手势(PanGesture) .PanGestureOptions(value?:{ fingers?:number; direction?:PanDirection; distance?:number}) 拖动手势用于触发拖动手势事件,滑动达到最小滑动距离(默认值为5vp)时拖动手势识别成功&am…...

计算机毕设之基于Python+django+MySQL可视化的学习系统的设计与实现
系统阐述的是使用可视化的学习系统的设计与实现,对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计,描述,实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭建系统的整体架构。利…...

Kotlin inline、noinline、crossinline 深入解析
主要内容: inline 高价函数的原理分析Non-local returns noinlinecrossinline inline 如果有C语言基础的,inline 修饰一个函数表示该函数是一个内联函数。编译时,编译器会将内联函数的函数体拷贝到调用的地方。我们先看下在一个普通的 kot…...

在 CentOS 7 / RHEL 7 上安装 Python 3.11
原文链接:https://computingforgeeks.com/install-python-3-on-centos-rhel-7/ Python 是一种高级解释性编程语言,已被用于各种应用程序开发,并在近年来获得了巨大的流行。Python 可用于编写广泛的应用程序,包括 Web 开发、数据分…...

SVN基本使用笔记——广州云科
简介 SVN是什么? 代码版本管理工具 它能记住你每次的修改 查看所有的修改记录 恢复到任何历史版本 恢复己经删除的文件 SVN跟Git比,有什么优势 使用简单,上手快 目录级权限控制,企业安全必备 子目录Checkout,减少不必要的文件检出…...