2024-06-05 Android app jni里面c语言函数申请的局部变量数组过大会导致程序崩溃的问题分析

一、下面是一个app jni里面一个函数,函数里面定义一个数组,实际运行的时候发现数组过大的时候会导致app崩溃。

JNIEXPORT jint JNICALL JNI_FUNCTION(native_1getcapture_1data)
  (JNIEnv *env, jobject obj,jbyteArray des_data,jbyteArray src_data,jint width,jint height)
{
    uint8_t buf[1024 * 1024 * number];

二、崩溃的log,也能看出是内存的问题导致crash。

三、在C语言中,函数内局部变量的数组所能申请的最大字节数主要受两个因素的限制:

  1. 系统的栈大小限制局部变量通常分配在栈上,不同操作系统和编译器对栈大小有不同的默认限制。例如,在Linux系统上,栈大小通常是8 MB,而在Windows系统上,默认栈大小通常是1 MB。这个值可以通过编译器选项或线程库函数进行调整。

  2. 编译器实现的限制:不同的编译器可能对局部变量大小有不同的限制,但这通常是次要的,主要的限制还是系统的栈大小。

由于栈空间是有限的,分配过大的局部数组可能导致栈溢出(stack overflow),导致程序崩溃。因此,分配局部数组时需要谨慎。

三、可以通过 ulimit -s 命令查看当前栈大小限制

四、android app应用程序包名是 com.example.myapp,你可以使用以下命令查看其内存信息,这里重点关注栈stack信息。

四、写一个简单程序测试申请到多大stack程序会崩溃,没点击一下增加1M

4.1

int number = 1;
JNIEXPORT jint JNICALL JNI_FUNCTION(native_1getcapture_1data)
  (JNIEnv *env, jobject obj,jbyteArray des_data,jbyteArray src_data,jint width,jint height)
{
    uint8_t buf[1024 * 1024 * number];
    for(int i = 0 ;i < 1024 * 1024 * number;i++)
        buf[i]  = 0xFF;

    sleep(3);
    number++;
}

4.2

4.3 点击增加1M,2072-1048=1024 ,到了7192后再加的时候app会crash。

五、为什么函数推出了后使用dumpsys meminfo命令看 Stack 值还是没有变。

六、in a word ,c语言数组里面需要用到大内存的数组可以使用同态内存分配。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

视频生成框架EasyAnimate正式开源!

近期&#xff0c;Sora模型的热度持续上涨&#xff0c;社区中涌现了一些类Sora的开源项目&#xff0c;这些项目均基于Diffusion Transformer结构&#xff0c;使用Transformer结构取代了UNet作为扩散模型的基线&#xff0c;旨在生成更长、更高分辨率、且效果更好的视频。EasyAnim…

组合和为N的数量-第13届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第78讲。 组合和为N的数量&…

直播用什么领夹麦比较好?轻揭秘无线领夹麦克风哪个品牌音质最好

​在当下自媒体风起云涌的时代&#xff0c;领夹式无线麦克风以其卓越的音质和便携性&#xff0c;已然成为视频博主、直播达人和新闻访谈的得力助手。在短视频、直播互动、在线访谈等多个场景中&#xff0c;它们默默守护着每一声清晰的传递&#xff0c;为内容的呈现增色添彩。面…

AWS EMR Serverless

AWS概述 EMR Serverless 简介 在AWS概述一文中简单介绍过AWS EMR, 它是AWS提供的云端大数据平台。借助EMR可以设置集群以便在几分钟内使用大数据框架处理和分析数据。创建集群可参考官方文档&#xff1a;Amazon EMR 入门。但集群创建之后需要一直运行&#xff0c;用户需要管理…

SSL证书到底怎么选?

在全球CA官方原厂的SSL证书兼容性达到99%的机构仅有4家&#xff0c;其中一家勉强&#xff0c;分别&#xff1a;GlobalSign、DigiCert、Sectigo、Certum&#xff0c;如果不在这个范围的建议都不用看。 【不包括套用品牌的“国产化”SSL证书、山寨SSL证书&#xff0c;这些证书的…

聊一聊 js的事件循环、进程、线程、定时器延迟问题

概括来说是什么&#xff1f; 所谓Event Loop&#xff0c;就是事件循环&#xff0c;其实就是JS管理事件执行的一个流程&#xff0c;具体的管理办法由他具体的运行环境确定。目前JS的主要运行环境有两个&#xff0c;浏览器和Node.js。这两个环境的Event Loop还有点区别&#xff…

Leetcode 力扣107. 二叉树的层序遍历 II (抖音号:708231408)

给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&#xff09; 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[15,7],[9,20],…

LabVIEW 反向工程的实现与法律地位

什么是LabVIEW反向工程&#xff1f; 反向工程是指从现有的应用程序或软件中推导出其设计、架构、代码等信息的过程。对于LabVIEW而言&#xff0c;反向工程涉及从现有的VI&#xff08;虚拟仪器&#xff09;文件、项目或应用程序中提取出设计思路、功能模块、算法实现等。 LabV…

Ubuntu server 24.04 (Linux) 搭建DNS服务器 通过Nginx实现UDP/TCP负载均衡 轻量级dnsmasq服务器

一 系统运行环境 testtest:~$ cat /etc/os-release PRETTY_NAME"Ubuntu 24.04 LTS" NAME"Ubuntu" VERSION_ID"24.04" VERSION"24.04 LTS (Noble Numbat)" VERSION_CODENAMEnoble IDubuntu ID_LIKEdebian HOME_URL"https://www.…

【AI大模型】Prompt Engineering

目录 什么是提示工程&#xff08;Prompt Engineering&#xff09; Prompt 调优 Prompt 的典型构成 「定义角色」为什么有效&#xff1f; 防止 Prompt 攻击 攻击方式 1&#xff1a;著名的「奶奶漏洞」 攻击方式 2&#xff1a;Prompt 注入 防范措施 1&#xff1a;Prompt 注…

linux查看磁盘类型命令

在Linux中&#xff0c;有多种方法可以查看磁盘是固态硬盘&#xff08;SSD&#xff09;还是机械硬盘&#xff08;HDD&#xff09;。以下是一些常用的方法&#xff1a; 查看/sys/block/目录 /sys/block/目录包含了系统中所有块设备的信息。你可以查看这个目录中的设备属性来判断…

计算机网络 —— 数据链路层(以太网)

计算机网络 —— 数据链路层&#xff08;以太网&#xff09; 什么是以太网以太网传输介质和拓扑结构的发展传输介质的发展&#xff1a;拓扑结构的发展&#xff1a; 10BASE-T 以太网适配器和MAC地址适配器&#xff08;Adapter&#xff09;MAC地址适配器与MAC地址的关系 MAC帧以太…

保姆级教程:Redis 主从复制原理及集群搭建

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

Unity编辑器扩展-番外篇-Gizmos基础-物体如何在球面上移动

目录 一、本节目标效果展示 二、先画出素材 1.先新建一个普通的代码 2.画素材&#xff08;一个头&#xff0c;两个耳朵&#xff0c;一个鼻子&#xff09; a.关于贴心的Unity b.开始画素材 三、了解移动的原理 四、辅助物体的建立 五、画左耳朵 六、全部代码 七、作者的…

开源模型应用落地-LangChain试炼-LCEL-表达式语言(一)

一、前言 尽管现在的大语言模型已经非常强大&#xff0c;可以解决许多问题&#xff0c;但在处理复杂情况时&#xff0c;仍然需要进行多个步骤或整合不同的流程才能达到最终的目标。然而&#xff0c;现在可以利用langchain来使得模型的应用变得更加直接和简单。 LCEL是什么&…

AC自动机(查询)

上面讲了AC自动机是如何建树和建自动机的&#xff0c;这里要讲的是AC自动机的查询和各个数组的功能和作用。 其实AC自动机的查询和KMP算法是及其相近的&#xff0c;都是一个指针跑主串&#xff0c;另一个指针跑ne串&#xff08;这里就是回跳边&#xff09;。 话都说到这了&…

Linux C语言学习:数据类型

一、 为什么要引入数据类型 • 计算机中每个字节都有一个地址&#xff08;类似门牌号&#xff09; • CPU通过 地址 来访问这个字节的空间 0x20001103 1 0 0 1 0 0 1 1 0x20001102 1 1 1 0 1 1 1 0 0x20001101 1 1 1 1 0 1 0 1 0x20001100 0 …

南京观海微电子-----555函数信号发生器电路分析

电路图 整个电路的工作过程&#xff1a; 首先&#xff0c;555芯片通过外围电阻电容组成一个多谐振荡器&#xff0c;输出一个方波。 555多谐振荡器输出方波后&#xff0c;经电容C1耦合到由R3&#xff0c;C3组成的积分网络。输出三角波。这也是一个电容充放电的过程&#xff0c…

【Linux系统】进程信号

本篇博客整理了进程信号从产生到处理的过程细节&#xff0c;通过不同过程中的系统调用和其背后的原理&#xff0c;旨在让读者更深入地理解操作系统的设计与软硬件管理手段。 目录 一、信号是什么 1.以生活为鉴 2.默认动作与自定义动作 3.信号的分类、保存、产生 二、产生…