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

news2024/11/16 2:37:33

9.6 配置 native 方法

9.6.1 CMakeLists.txt 文件中内容,配置生成一个 so 库add_library( # Sets the name of the library. native-lib # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). src/main/cpp/native-lib.cpp ) 9.6.2 build.gradle externalNativeBuild {

make { cppFlags “” //使用ctrl+鼠标点击,可以跳转到对应源码,然后setxxx这里的xxx就是我们这里写的,每个上面都有官方的demo cFlags “” arguments “” abiFilters “armeabi-v7a” } }还有externalNativeBuild { cmake { path “CMakeLists.txt” //buildStagingDirectory 指定编译输出目录} }这里配置 cmake 的参数,使用 ctrl+鼠标 点击,会跳到具体的一个代码中。这个是gradle-3.2.1-sources 里面的。我们不知道该配什么参数的时候,就可以用这个方法,跳到对应的代码里面,这个类或者父类中的属性值,有 setXXXX 的,这里 XXXXX 就是我们可以在这里配置的参数,该配置什么,gradle-3.2.1-sources 源码中,在每个 setXXXX 上面,都有一段参考,并且有简单介绍。流程分析10.1 C++的代码,使用 CMake,编译成了 libnative-lib.so 库10.2 MainActivity.java 加载 so 库

static { System.loadLibrary(“native-lib”); }这个代码会在 MainActivity 初始化时候进行加载。10.3 MainActivity.java 关联 so 库中方法public native String stringFromJNI();这里的 native 指明是个本地方法,系统在调用的时候,会从加载的 so 库中去找。默认查找一个以Java+包名+方法名的方法,这里 stringFromJNI 就会查找 so 库中的Java_hellojni_codegg_com_hellojni_MainActivity_stringFromJNI 方法。除了这种默认的方法,有时候我们使用的是三方库,内部方法没法修改,这个时候就不能使用这个默认方法了。如果是这个情况,就需要我们进行配置,指定 Java 的某个方法和 C 的哪个关联。具体新增一个 so 库中实现一个叫做 JNI_onLoad 的方法,在里面进行注册 Java中的某个方法,和 C 中的方法匹配。int jniRegisterNativeMethods(JNIEnv* env, const char* className, const JNINativeMethod* gMethods, int numMethods) { jclass clazz; clazz = env->FindClass(className); if (clazz == NULL) { return-1; } if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) { //注册return-1;

}

return 0; } JNI_onLoad 方法是 Java 加载一个 so 库后,系统默认让执行的一个方法。如果找不到,就不执行了。一般我们在JNI_onLoad 来注册 Java 的某个方法和 C 的哪个关联,并且可以设定使用 Java 的具体版本。

10.4 相关文档https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html 关于 JNI ,这里就是官方的文档,关于相关的配置,这里都可以找到。后续有一章节,会实战到这个,继续加油。

  1. JNI 执行调用流程
    在这里插入图片描述
    make { cppFlags “” //使用ctrl+鼠标点击,可以跳转到对应源码,然后setxxx这里的xxx就是我们这里写的,每个上面都有官方的demo cFlags “” arguments “” abiFilters “armeabi-v7a” } }还有externalNativeBuild { cmake { path “CMakeLists.txt” //buildStagingDirectory 指定编译输出目录} }这里配置 cmake 的参数,使用 ctrl+鼠标 点击,会跳到具体的一个代码中。这个是gradle-3.2.1-sources 里面的。我们不知道该配什么参数的时候,就可以用这个方法,跳到对应的代码里面,这个类或者父类中的属性值,有 setXXXX 的,这里 XXXXX 就是我们可以在这里配置的参数,该配置什么,gradle-3.2.1-sources 源码中,在每个 setXXXX 上面,都有一段参考,并且有简单介绍。流程分析10.1 C++的代码,使用 CMake,编译成了 libnative-lib.so 库10.2 MainActivity.java 加载 so 库

static { System.loadLibrary(“native-lib”); }这个代码会在 MainActivity 初始化时候进行加载。10.3 MainActivity.java 关联 so 库中方法public native String stringFromJNI();这里的 native 指明是个本地方法,系统在调用的时候,会从加载的 so 库中去找。默认查找一个以Java+包名+方法名的方法,这里 stringFromJNI 就会查找 so 库中的Java_hellojni_codegg_com_hellojni_MainActivity_stringFromJNI 方法。除了这种默认的方法,有时候我们使用的是三方库,内部方法没法修改,这个时候就不能使用这个默认方法了。如果是这个情况,就需要我们进行配置,指定 Java 的某个方法和 C 的哪个关联。具体新增一个 so 库中实现一个叫做 JNI_onLoad 的方法,在里面进行注册 Java中的某个方法,和 C 中的方法匹配。int jniRegisterNativeMethods(JNIEnv* env, const char* className, const JNINativeMethod* gMethods, int numMethods) { jclass clazz; clazz = env->FindClass(className); if (clazz == NULL) { return-1; } if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) { //注册return-1;

}

return 0; }
绘制流程(图)
市面上讲解绘制,直接上来一堆内容,我这里先忽略掉细节,我们来说下简单的绘制代表什
么。
我们自己画东西的时候,需要画笔,画板(画布),然后有各种涂料。

在安卓里面,这里画板就是 Canvas ,而画笔就是对应的各种 API。
那么接下来我们说下,这 Canvas 的简单逻辑,让你一目了然。
我们画的东西,叫做一个内存,叫做 FrameBuffer,这个有时候是双缓存。
然后我们每个 Activity 创建的时候,都会申请一个 Surface ,这个被叫做 平面,然后这个对
应到一个 Buffer,这一组由 Activity 或者是系统对话框,系统中使用 WMS.addView 添加进来
的 Buffer 组合。
依据层叠关系放置,而 SurfaceFlinger 这边会完成所谓的合并,绘制,推送到真正的屏幕
FrameBuffer,完成显示。
我来给大家发画一张图,大家大致看一下,形成印象。
在这里插入图片描述

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

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

相关文章

一刷代码随想录——数组

概念数组是存放在连续内存空间上的相同类型数据的集合连续&#xff1a;增删需移动后续元素&#xff0c;删除的本质是覆盖类型&#xff1a;相同用数组&#xff0c;不同用结构数组下标从0开始C中二维数组连续分布vector的底层实现是array&#xff0c;严格来讲vector是容器&#x…

C++11 并发指南四( 详解三 stdfuture stdshared_future)

C11 并发指南四( 详解三 std::future & std::shared_future) 文章目录C11 并发指南四( 详解三 std::future & std::shared_future)std::future 介绍std::future 成员函数std::shared_future 介绍std::future_error 介绍其他与 std::future 相关的函数介绍其他与 std::f…

SWIFT Framework .NET 2023.1 Crack

SWIFT 组件 SWIFT Components 多年来一直致力于银行机构软件、在线交易软件、CRM 和零售和商业解决方案中的计费应用程序&#xff0c;以及医药和高度关键任务的 24/7 运营应用程序。作为定制银行解决方案的开发商&#xff0c;SWIFT Components 拥有所有银行产品和部门的专业知识…

【python从零入门 | 03】基本数据类型之“除法“

🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专家博主 💊交流社区:CSDN云计算交流社区欢迎您的加入! 目

设置/恢复系统隐藏文件 - Windows系统

设置/恢复系统隐藏文件 - Windows系统前言普通隐藏文件显示文件设置/取消隐藏系统隐藏文件显示文件设置/取消隐藏前言 本文介绍Windows系统如何设置/恢复隐藏文件&#xff0c;隐藏文件包含普通隐藏文件和系统隐藏文件&#xff0c;系统隐藏文件一般是受保护的系统文件&#xff…

Android 蓝牙开发——Avrcp协议(十二)

SDK路径&#xff1a;frameworks/base/core/java/android/bluetooth/ 服务路径&#xff1a;packages/apps/Bluetooth/src/com/android/bluetooth/ 在使用协议类的时候无法找到该类&#xff0c;由于安卓源码中关于蓝牙协议的 Client 部分或相关接口都被 hide 给隐藏掉了&#xf…

【通信原理(含matlab程序)】实验一 双边带模拟调制和解调

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; 本人持续分享更多关于电子通信专业内容以及嵌入式和单片机的知识&#xff0c;如果大家喜欢&#xff0c;别忘点个赞加个关注哦&#xff0c;让我们一起共同进步~ &#x…

AcWing - 寒假每日一题2023(DAY 11——DAY 15)

文章目录一、AcWing 4656. 技能升级&#xff08;困难&#xff09;1. 实现思路2. 实现代码二、AcWing 4454. 未初始化警告&#xff08;简单&#xff09;1. 实现思路2. 实现代码三、AcWing 4509. 归一化处理&#xff08;简单&#xff09;1. 实现思路2. 实现代码四、AcWing 4699. …

OpenCV实战(8)——直方图详解

OpenCV实战&#xff08;8&#xff09;——直方图详解0. 前言1. 直方图概念2. 直方图计算2.1 灰度图像直方图计算2.2 彩色图像直方图计算3. 应用查找表修改图像3.1 查找表3.2 拉伸直方图提高图像对比度3.3 在彩色图像上应用查找表4. 图像直方图均衡化5. 完整代码小结系列链接0. …

操作流程违规作业监测系统 yolov7

操作流程违规作业监测系统通过pythonyolov7网络深度学习技术&#xff0c;对高危场景下作业人员未按照操作流程进行正常操作行为进行实时分析识别检测&#xff0c;发现现场人员违规作业操作行为&#xff0c;不需人为干预&#xff0c;立即自动抓拍存档预警。YOLOv7 在 5 FPS 到 1…

在 VSCode 中像写 TypeScript 一样写 JavaScript

大家好&#xff0c;我是前端西瓜哥。 我们在 VSCode 编辑器中编写 js 代码&#xff0c;是会提供类型提示的。 VSCode 会推断一个变量是什么类型&#xff0c;并在你输入内容的时候&#xff0c;提供对应的 API 属性或方法补全。 如下图&#xff0c;在 js 文件中&#xff0c;ar…

【Java】到底什么是包?|最通俗易懂讲解|保姆级

博主简介&#xff1a;努力学习的预备程序媛一枚~博主主页&#xff1a; 是瑶瑶子啦所属专栏: Java岛冒险记【从小白到大佬之路】 目录Part1&#xff1a;类比理解&#xff1a;Part2&#xff1a;与包&#xff08;package)正式见面&#xff1a;2.1&#xff1a;包的本质--文件夹2.2&…

学习C++基本数值类型

写在前面 正在学习C/C/Javascript&#xff0c;面向初学者撰写专栏 博主原创C/C笔记&#xff08;干货&#xff09;&#xff0c;如有错误之处请各位读者指正 请读者评论回复、参与投票&#xff0c;反馈给作者&#xff0c;我会获得持续更新各类干货的动力。 致粉丝&#xff1a;可以…

力扣刷题记录——709. 转换成小写字母、771. 宝石与石头、704. 二分查找

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《力扣刷题记录——709. 转换成小写字母、771. 宝石与石头…

C++11并发指南二(stdthread详解)

C11并发指南二&#xff08;stdthread详解&#xff09; 文章目录C11并发指南二&#xff08;stdthread详解&#xff09;std::thread 构造move 赋值操作其他成员函数上一篇博客《 C11 并发指南一(C11 多线程初探)》中只是提到了 std::thread 的基本用法&#xff0c;并给出了一个最…

{(leetcode 题号:169. 多数元素)+(189. 轮转数组)}时间复杂度与空间复杂度分析:

目录 一. 基本概念 1.时间复杂度 2.空间复杂度 二.实例分析 实例(1):旋转数组 方法1:暴力旋转法(时间复杂度加空间复杂度分析) 方法2 :三步整体逆序法 (时间复杂度加空间复杂度分析) 实例(2):斐波那契递归的时间复杂度和空间复杂度分析 实例(3)&#xff1a;169. 多数元素…

模拟实现C库函数(1)

"啊~所有经历给它赋予魔力。"很久没更新过C专栏的文章了&#xff0c;借复习(review)的机会&#xff0c;本节的内容针对我们一些常见、常用的C库函数的模拟实现。“当你行走了一段时间后&#xff0c;回头往往那不管是起初咿咿呀呀胡乱踩陷的小坑时&#xff0c;还是之后…

C++11并发指南三(stdmutex详解)

C11并发指南三&#xff08;std:mutex详解&#xff09; 文章目录C11并发指南三&#xff08;std:mutex详解&#xff09;<mutex> 头文件介绍Mutex 系列类(四种)Lock 类&#xff08;两种&#xff09;其他类型函数std::mutex 介绍std::mutex 的成员函数std::recursive_mutex 介…

miracl

文章目录Windows平台编译网址 https://miracl.com/https://github.com/miracl/MIRACL Windows平台编译 源码目录下新建文件夹ms32或ms64&#xff0c;把/lib/ms32doit.bat或ms64doit.bat分别拷进去。 把源码include和source目录所有文件拷贝进要编译的ms32或ms64&#xff0c…

32. 实战:PyQuery实现抓取TX图文新闻

目录 前言 &#xff08;链接在评论区&#xff09;&#xff08;链接在评论区&#xff09;&#xff08;链接在评论区&#xff09; 目的 &#xff08;链接在评论区&#xff09;&#xff08;链接在评论区&#xff09;&#xff08;链接在评论区&…