Android ANativeWindow 渲染画面

news2024/11/23 15:35:54

ANativeWindow 是 Android NDK(Native Development Kit)提供的一个C/C++编程接口,用于与底层的图形系统进行交互,实现图像渲染和处理等功能。


使用方法:上层用 SurfaceView,传递 SurfaceView 的 Surface 给 native 层,在 native 层中把 Surface 转换为 ANativeWindow 进行渲染


例如,用 ANativeWindow 渲染一个纯色页面:

MainActivity:

public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback{

    static {
        System.loadLibrary("native-lib");
    }

    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        binding.surfaceView.getHolder().addCallback(this);
    }

    @Override
    public void surfaceCreated(@NonNull SurfaceHolder holder) {
    }

    @Override
    public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {
        setSurface(holder.getSurface());
    }

    @Override
    public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
    }

    public native void setSurface(Surface surface);

}

可以看到 setSurface 方法是一个 native 函数,就是把上层的 Surface 传递给底层


native 层:

extern "C"
JNIEXPORT void JNICALL
Java_xxx_MainActivity_setSurface(JNIEnv *env, jobject thiz, jobject surface) {

    ANativeWindow* window = ANativeWindow_fromSurface(env, surface);
    if (window == NULL) { // 处理无效的 ANativeWindow 对象
        return;
    }

    int32_t width = ANativeWindow_getWidth(window);
    int32_t height = ANativeWindow_getHeight(window);

    ANativeWindow_setBuffersGeometry(window, width, height, WINDOW_FORMAT_RGBA_8888);

    ANativeWindow_Buffer buffer;
    if (ANativeWindow_lock(window, &buffer, NULL) == 0) {
        uint32_t* pixels = static_cast<uint32_t*>(buffer.bits);
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                pixels[y * buffer.stride + x] = 0xFFFF0000;
            }
        }
        ANativeWindow_unlockAndPost(window);
    }
    ANativeWindow_release(window); // 释放
}

①ANativeWindow_fromSurface():
将 Android 的 Surface 对象转换为 ANativeWindow 对象,以便进行图像渲染和处理。

②ANativeWindow_setBuffersGeometry():
用于设置 ANativeWindow 的缓冲区几何属性。告诉系统如何分配和管理 ANativeWindow 的图像缓冲区。

③ANativeWindow_lock():
用于锁定 ANativeWindow 的图像缓冲区获取操作缓冲区的像素数据,并确保数据一致性和线程安全性。

④ANativeWindow_unlockAndPost():
解锁 ANativeWindow 的图像缓冲区,并通知系统图像缓冲区已被修改,以便进行后续处理和刷新操作。


通过使用 ANativeWindow 接口,开发人员可以直接与底层的图形系统交互,实现高性能的图像渲染和处理。它在游戏开发、图像处理和视频播放等领域中得到广泛应用。

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

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

相关文章

ChatGPT的插件能用了,每月 20 美元的实习生真香

文章目录 开启插件并使用其他补充缺点和不足总结 哈喽嗨&#xff01;你好&#xff0c;我是小雨青年&#xff0c;一名 追赶 AI 步伐的程序员。 自从上周 OpenAI 官宣了即将开放插件给 Plus 用户以来&#xff0c;这三天我就每天都会刷新ChatGPT 设置页面。 直到今天早上&#x…

SolVES模型应用(生态系统服务社会价值模型)

生态系统服务是人类从自然界中获得的直接或间接惠益&#xff0c;可分为供给服务、文化服务、调节服务和支持服务4类&#xff0c;对提升人类福祉具有重大意义&#xff0c;且被视为连接社会与生态系统的桥梁。自从启动千年生态系统评估项目&#xff08;Millennium Ecosystem Asse…

思迈特软件Smartbi荣登“2023未来银行科技服务商100强”

近日&#xff0c;中国科学院《互联网周刊》、eNet研究院联合发布了“2023未来银行科技服务商100强”企业榜单。思迈特软件以“商业智能BI产品”凭借在金融科技创新的独特优势及在银行数字化转型实践中的卓越成就荣耀上榜。 据了解&#xff0c;“未来银行科技服务商100强”榜单&…

SQL删除重复的记录(只保留一条)-窗口函数row_number()

文章目录 一、关于mysql表中数据重复二、聚合函数min(id)not in二、窗口函数row_number()四、补充&#xff1a;常见的窗口函数 一、关于mysql表中数据重复 关于删除mysql表中重复数据问题&#xff0c;本文中给到两种办法&#xff1a;聚合函数、窗口函数row_number()的方法。 (注…

ffmpeg-mpv配置详解04

mpv.conf 格式详解 存放位置 windows下 Roaming\mpv linux下在.conf/mpv # mpv conf ################################################################################ # 记忆播放[退出时记住播放状态、音量、播放速度、位置等] save-position-on-quit # 播放状态保存位置…

运行时栈帧结构与方法调用

1 运行时栈帧结构 Java虚拟机以方法作为最基本执行单元&#xff0c;“栈帧”则是用于支持虚拟机进行方法调用和方法执行背后的数据结构。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。 1.1 局部变量表 局部变量表的容量以变量槽为最小单位。 Java…

强化学习:贝尔曼方程(Bellman Equation)

∗ ∗ 重点&#xff1a;状态值、贝尔曼方程 ∗ ∗ **重点&#xff1a;状态值、贝尔曼方程** ∗∗重点&#xff1a;状态值、贝尔曼方程∗∗ return评估策略 在前面概念介绍中&#xff0c;我们知道了可以用 return 来评估一个策略的好坏。如图&#xff0c;有三个不同的策略&…

线性插值提高DDS相位分辨率

DDS&#xff08;Direct Digital Synthesizer&#xff09;即直接数字频率合成技术&#xff0c;主要由正弦查找表与控制器组成&#xff0c;通过控制器给出的相位&#xff0c;在正弦查找表中查找对应的正余弦值并予以输出。通过多个 DDS 信号的组合&#xff0c;可以进一步构建出 A…

【源码解析】Disruptor框架的源码解析

Disruptor初始化 初始化Disruptor实例 //单线程模式&#xff0c;获取额外的性能 Disruptor<MessageModel> disruptor new Disruptor<>(factory, bufferSize, executor,ProducerType.SINGLE, new BlockingWaitStrategy());创建RingBuffer实例 Deprecatedpublic D…

Midjourney|文心一格prompt教程[Text Prompt(上篇)]:品牌log、App、徽章、插画、头像场景生成,各种风格选择:科技风、运动风

Midjourney|文心一格prompt教程[Text Prompt&#xff08;上篇&#xff09;]&#xff1a;品牌log、App、徽章、插画、头像场景生成&#xff0c;各种风格选择&#xff1a;科技风、运动风 1.撰写 Text Prompt 注意事项 Midjourney 跟 ChatGPT 在 prompt 的使用上有很多不一样的地…

怎么做好媒体邀约

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好 要做好媒体邀约&#xff0c;以下是一些关键步骤和建议&#xff1a; 1. 制定媒体邀约方案&#xff1a;首先&#xff0c;确定您希望邀约的目标媒体。了解他们的受众、内容定位和报道风格&#xff0c;确保与您的品牌和目标受众…

ChatGPT 的工作原理:深入探究

本文首发于微信公众号&#xff1a;大迁世界, 我的微信&#xff1a;qq449245884&#xff0c;我会第一时间和你分享前端行业趋势&#xff0c;学习途径等等。 更多开源作品请看 GitHub https://github.com/qq449245884/xiaozhi &#xff0c;包含一线大厂面试完整考点、资料以及我的…

opencv实践项目-图片拼接之缝合线算法

目录 1. stitcher_detail执行过程2. 源码3. stitching_detail 程序接口介绍4. 执行5. 结果图 1. stitcher_detail执行过程 stitcher_detail是opencv官网提供的一个用于多福图像拼接的Demo&#xff0c;其主要过程如下&#xff1a; 1.输入待拼接图像集合&#xff1b;2.分别对每幅…

Jetson Nano调试记录:机电设备控制

边缘应用中,机电控制是一项非常重要的能力。 当我们的智能设备在远端环境中,根据所识别的状况变化去执行应对措施,更大程度度地降低对人为操作的依赖,这些都是能产生更大经济效益的应用,包括无人驾驶车、自动机械手臂等等。 实际工业应用场景中的控制元件是非常多样化的,…

惠普暗影精灵5 super 873-068rcn怎样用u盘重装系统win10

当我们的戴尔电脑出现问题的时候&#xff0c;无法进入系统要怎么重装系统win10修复呢?比较常用的就是借助u盘重装系统win10&#xff0c;需要用到装机工具。下面就给大家详细介绍下戴尔电脑怎样用u盘重装系统win10教程。 工具/原料&#xff1a; 系统版本&#xff1a;windows1…

LSTM-理解 Part-3(LSTM Networks)

之前博客中有涉及前两部分的介绍&#xff1a; 第一部分LSTM-理解 Part-1&#xff08;RNN&#xff1a;循环神经网络&#xff09; 第二部分LSTM-理解 Part-2&#xff08;RNN的局限性&#xff09; 这是其中的第三部分&#xff0c;讲解 LSTM Networks。 LSTM Networks 长短期记忆网…

【Python MySQL】零基础也能轻松掌握的学习路线与参考资料

Python是一种广泛使用的编程语言&#xff0c;MySQL是一个流行的关系数据库管理系统。学习Python和MySQL可以帮助开发人员更有效地处理数据&#xff0c;并构建可扩展和强大的Web应用程序。本文将介绍Python MySQL学习路线&#xff0c;参考资料和优秀实践。 Python MySQL学习路线…

美的智家、海尔智家,吹响新一轮AI竞赛号角

ChatGPT大行其道&#xff0c;各行各业迫不及待披上了AI大模型的“盔甲”&#xff0c;有的企业自研AI大模型&#xff0c;有的企业牵手头部科技企业&#xff0c;寻求智能产品价值的最大化&#xff0c;智能家电行业也不例外。 在国内&#xff0c;百度AI大模型文心一言一经推出就吸…

卷绕模型介绍

卷绕模型是收放卷应用的基础知识,这篇博客帮大家整理分析,有关收放卷的其它相关基础知识请参看专栏相关文章。和这篇文章相关联的知识点大家可以参看下面的博客 体积法计算卷径详细介绍 卷径计算详解(通过卷绕的膜长和膜厚进行计算)_RXXW_Dor的博客-CSDN博客有关卷绕+张力控…

LoRA:大模型的低秩自适应微调模型

对于大型模型来说&#xff0c;重新训练所有模型参数的全微调变得不可行。比如GPT-3 175B&#xff0c;模型包含175B个参数吗&#xff0c;无论是微调训练和模型部署&#xff0c;都是不可能的事。所以Microsoft 提出了低秩自适应(Low-Rank Adaptation, LoRA)&#xff0c;它冻结了预…