[问题记录]JNI的整型数组返回出现stack corruption

2023-05-16

[问题记录]JNI的整型数组返回出现stack corruption

  在项目中编写了一个返回整型数组的JNI代码,但是在测试时发现问题,会产生stack corruption错误,debug之后发现是return的地方出错,故在此记录。本人水平有限,如果理解有错,请多多指教。

1.错误代码

C:

//native-lib.c
JNIEXPORT jintArray JNICALL
Java_com_example_final2_MainActivity_read_1from_1device(JNIEnv *env, jobject thiz, jint len) {
    // TODO: implement read_from_device()
    int  n=0,i=0;
    char buf[100];
    int *buf_int;
    buf_int = (int*)malloc(sizeof(int)*len);

    int l = len;
    //从设备节点fd_io中读取一个字符串
    if (read(fd_io,buf,l)){
        jintArray jntarray = (*env)->NewIntArray(env, len);
        jint * jintp = (*env)->GetIntArrayElements(env, jntarray, NULL);
		//将char类型数组转为int类型数组,并将int类型数组赋值给jntarray类型数组
        for(i=0;buf[i]!='\0';i++){
            buf_int[n++] = buf[i]-'0';
            jintp[i] = buf_int[i];
        }
        free(buf_int);
        (*env)->ReleaseIntArrayElements(env, jntarray, jintp, 0);
        return jntarray;
    }
    else{
        return 0;
    }

  这个函数的功能是将从节点中read出的含有一个元素的char数组转为int类型数组再转为jntarray类型数组输出。

JAVA:

public class MainActivity extends AppCompatActivity {

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }
     @Override
    protected void onCreate(Bundle savedInstanceState) {
        //omission...
        int[] as = read_from_device(1);  //len
        System.out.println(Arrays.toString(as));
        //omission...
        }
        public native int[] read_from_device(int len);
}

  但是在执行是出现了堆栈破损错误,同时另一个read很多元素的char数组执行同样的操作并return却不会报错。

  原因在没有理解:

(*env)->ReleaseIntArrayElements(env, jntarray, jintp, 0);

  这一步操作的意义是,将jintp的值传给jntarray,同时将jintp指针释放,然而,jintp是定义jntarray空间的指针,因此,当只有一个数据将要被传递时,jintp释放时,jntarray所在空间也被销毁。
  总而言之,在有(*env)->ReleaseIntArrayElements(env, jntarray, jintp, 0)语句时,不应该return jntarray,会造成错误。

2.修改代码

  因此,上述功能的代码可以修改为:

C:

JNIEXPORT jint JNICALL
	Java_com_example_final2_MainActivity_final_1read_1return(JNIEnv *env, jobject thiz,
		                                                 jintArray get_int_array) {
	    //新代码直接将char->int变换后的值赋给JAVA传来的整型数组指针,从而直接改变JAVA中对应的整形数组的值,省去了中间传递的部分。
	    char buf_read[2];
	    if (read(fd_io,buf_read,1)) {
		jint *jintp = (*env)->GetIntArrayElements(env, get_int_array, NULL);
		for (int i = 0; buf_read[i] != '\0'; i++) {
		    jintp[i] = buf_read[i] - '0';
		}
		//将创建的jintp指针用完后及时释放,ReleaseIntArrayElements的作用就是将数据处理结构同步到 java 数组,并释放数组指针
		(*env)->ReleaseIntArrayElements(env, get_int_array, jintp, 0);
		return 1;
	    }
	    else return 0;
	}

JAVA:

public class MainActivity extends AppCompatActivity {

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }
     @Override
    protected void onCreate(Bundle savedInstanceState) {
        //omission...
        int[] test_return_array={0};  //这里一定要给整型数组赋初值,否则无法传回值
        test_return(test_return_array);
        //打印日志的方式输出结果
        Log.d("return array",Arrays.toString(test_return_array));
        for(int i :test_return_array){
            System.out.println(i);
        }
        //omission...
        }
        public native int final_read_return(int[] get_int_array);
}

  至此解决了所有的问题,而且代码也更加简介规范。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[问题记录]JNI的整型数组返回出现stack corruption 的相关文章

  • 函数内声明的 const 数组是否存储在堆栈中?

    如果这是在函数中声明的 它会在堆栈上声明吗 它是 const 让我想知道 void someFunction const unsigned int actions 8 e1 e2 etc 是的 它们在堆栈上 您可以通过查看此代码片段来了解这
  • 这种类型的内存是在堆还是堆栈上分配的?

    在 C 上下文中 这并不重要 class Foo private int x 100 public Foo 我所学到的告诉我 如果您像这样创建 Foo 的实例 Foo bar new Foo 然后数组 x 被分配在堆上 但是如果您像这样创建
  • C语言函数指针内存解释

    include
  • Widcomm蓝牙:如何打开虚拟COM

    我正在尝试使用 Broadcomm 的 Widcomm 蓝牙堆栈 它应该可以工作 但有一件事我仍然无法理解 当我需要通信时 如何自动打开虚拟 COM 我正在尝试使用 SPP 串行端口配置文件 但 SDK 的文档并不是那么详尽 拜托 我就是不
  • 如何找到最大堆栈大小?

    我正在使用 Ubuntu 11 04 如何找出进程的最大调用堆栈大小以及堆栈的每个帧的大小 快速谷歌搜索应该会显示关于这个主题的一些信息 http www cs nyu edu exact core doc stackOverflow tx
  • 在Java中,为什么Stack是一个具体类,而Queue是一个接口?

    Queue 的哪一个子类是 普通 队列 1 java util Stack 是 Java 1 0 的遗留类 它早于 Collections 框架很多年 坦率地说 它是一个例子horrible多方面的设计 一切都不是事情应有的样子 主要问题是
  • 如果堆栈在数字较低的地址处增长,为什么指针比较会颠倒这一点?

    由于堆栈向下增长 即朝着数值较小的内存地址增长 为什么 i lt j是真的 如果我错了 请纠正我 但我想这是 C 创建者 C 维护的 的设计决定 但我想知道为什么 同样奇怪的是 堆分配的对象pin位于比堆栈变量在数值上更高的内存地址 这也与
  • 什么是 C/C++ 数据段和堆栈大小?

    我读到这取决于编译器和操作系统架构 如何在使用 GCC 作为编译器的 Linux 系统上找到数据段和堆栈最大大小 让我和你一起实验一下 创建文件 test c 如下所示 int main void return 0 现在编译它 指定最大堆栈
  • 在 Ubuntu 11.04 中禁用堆栈崩溃保护

    我在 2007 年 MacBook 上运行 32 位 Ubuntu 11 04 并且刚刚开始了解缓冲区溢出漏洞 我正在尝试运行书中的示例程序 但 Ubuntu 的安全措施使我无法成功执行缓冲区溢出 这是我尝试运行的代码 include
  • 为什么堆上的内存分配比堆栈上的内存分配慢得多?

    我已经被告知很多次了 但我不知道为什么 从堆分配内存时会涉及哪些额外成本 与硬件有关吗 与CPU周期有关吗 这么多的猜测 但没有确切的答案 有人能给我一些详细说明吗 正如 unwind 所说 Heap数据结构比Stack更复杂 在我看来 当
  • 修改栈上的返回地址

    我研究了缓冲区溢出漏洞的基础知识 并尝试了解堆栈是如何工作的 为此 我想编写一个简单的程序 将返回地址的地址更改为某个值 有人可以帮助我计算基指针的大小以获得第一个参数的偏移量吗 void foo void char ret char pt
  • NOP 雪橇如何工作?

    我找不到回答这个问题的好来源 我知道 nop sled 是一种用于规避缓冲区溢出攻击中堆栈随机化的技术 但我无法理解它是如何工作的 有什么简单的例子可以说明这种方法 128 字节 nop sled 等术语是什么意思 有些攻击包括使程序跳转到
  • 使用 3DES 和 CBC 损坏的加密数据的前 8 个字节

    我在应用程序中使用 PyCrypto 来加密数据 但由于某种原因 无论我做什么 前 8 个字节 对应于第一个块 都会损坏 gt gt gt from Crypto Cipher import DES3 gt gt gt from Crypt
  • 有没有比使用 backtrace() 更便宜的方法来查找调用堆栈的深度?

    我的日志记录代码使用的返回值回溯 http linux die net man 3 backtrace确定当前堆栈深度 出于漂亮的打印目的 但我可以从分析中看到这是一个相当昂贵的调用 我不认为有更便宜的方法吗 请注意 我不关心帧地址 只关心
  • 奇怪的 MSC 8.0 错误:“ESP 的值未在函数调用中正确保存...”

    我们最近尝试将一些 Visual Studio 项目分解为库 并且在测试项目中一切似乎都编译和构建得很好 其中一个库项目作为依赖项 然而 尝试运行该应用程序给我们带来了以下令人讨厌的运行时错误消息 运行时检查失败 0 ESP 的值未在函数调
  • 如何从 obj-c / ios 中的堆栈跟踪获取源代码行

    I use NSSetUncaughtExceptionHandler将堆栈跟踪打印到 iPhone 中的本地文件 该文件将在下次应用程序启动时发送到我们的服务器 然后我可以检查异常数据并修复错误 在某些崩溃中 我有模块名称和引发异常的函数
  • 如何检查 uiviewcontroller 是否存在于 uinavigationcontroller 堆栈中

    我有一个UINavigationController 我必须从 a 中弹出一个视图UINavigationController并将其替换为另一个视图 我们如何才能搜索到一个UIViewController对象并将其替换为另一个 当我打印时
  • 什么是堆栈随机化以及它如何防止缓冲区溢出攻击?

    我从一本书上读到缓冲区溢出可能被用作注入攻击系统的漏洞代码的一种方式 和堆栈随机化是防止此类攻击的有效方法之一 我不明白是什么堆栈随机化以及它如何防止这些攻击 代替堆栈随机化克服 或更难 堆栈或缓冲区溢出的技术称为地址空间布局随机化 ASL
  • 初学者对x86堆栈的困惑

    首先 我想知道这个模型是否准确地表示了堆栈 成帧 过程 有人告诉我 从概念上讲 堆栈就像可乐瓶 糖在底部 你把它填到顶部 考虑到这一点 如果 EIP 在另一个瓶子中 它在代码段中 而不是堆栈段中 那么 Call 如何告诉 EIP 寄存器 定
  • 将 std::stack .pop() 方法的结果存储到变量中

    我想做以下事情 std stack

随机推荐

  • Java常见面试问题总结

    Java常见面试问题总结 说明 xff1a 本人是二线城市工作4 5年的菜鸟程序员 xff0c 以下面试问题更侧重于当地的初中级 高开 要是以北上广深的面试标准问则还远远不够 xff0c 就比如在一线城市JDK List Map Set x
  • RabbitMQ学习教程

    RabbitMQ学习教程 MQ考察重点 xff1a span class token number 1 span 了解过哪些MQ xff1f 不同MQ之间有什么区别 xff1f span class token number 2 span
  • ArchLinux安装配置及美化

    官方wiki xff1a https wiki archlinux org 基础安装 一 xff1a 制作安装介质 下载ISO镜像文件 xff1a https archlinux org download 官方下载网址 在linux系统中可
  • K8s kubectl 报错 c-bash: _get_comp_words_by_ref: command not found解决过程

    K8s kubectl error xff1a c bash get comp words by ref command not found 故障现象 xff1a 新搭了个测试环境 xff0c 准备cka的考试 source lt kube
  • OpenSSH权限提升漏洞(CVE-2021-41617)修复 Centos 7升级Openssh 8.8

    OpenSSH权限提升漏洞 xff08 CVE 2021 41617 xff09 修复 1 准备工作2 安装必须的包3 下载OpenSsh 8 8p14 OpenSsh 解压安装5 配置文件修改6 重启服务7 意外 Centos 7升级Op
  • Jenkins 构建报错:Couldn‘t find any revision to build. Verify the repository and branch configuration for

    Jenkins 构建报错 Couldn 39 t find any revision to build Verify the repository and branch configuration for 1 错误信息 2 错误原因3 解决
  • 利用阿里云下载国外镜像,国内顺畅下载k8s.gcr.io的镜像

    国内顺畅下载k8s gcr io的镜像 1 起因 配置kube dns是3个k8s gcr io的镜像无法下载 报错如下 Error response from daemon Get https k8s gcr io v2 net http
  • pip 使用阿里源

    pip 使用阿里源 使用pip install 的时候默认会去国外服务器下载 所以经常断开或者速度很慢 只需要在原来的命令后加上 i https mirrors aliyun com pypi simple即可直接从阿里源上安装 pip s
  • sun.misc包找不到

    转 http blog csdn net jbxiaozi article details 7351768 1 右键项目 属性 java bulid path jre System Library access rules resoluti
  • npm安装vue报错:npm ERR! code ETIMEDOUT

    npm安装vue报错 信息如下 C span class token punctuation span Users span class token punctuation span Q span class token operator
  • 将element-plus分页组件由默认英文,改为中文

    1 现象 分页组件默认显示为英文 但实际页面中大多都是中文 弄个英文显得比较突兀 2 配置 在main js中添加以下两句语句 span class token function import span locale from span c
  • [Gitops--2]Argocd和Gitlab-runner安装配置

    ArgoCd Argo是一组k8s原生工具集 用于运行和管理k8s上的作业和应用程序 Argo提供了一种在k8s上创建工作和应用的三种计算模式 服务模式 工作流模式和基于事件模式 所有的Argo工具都实现为了创建控制器和自定义资源 为什么选
  • Windows update 0x8024401c 0x80244019

    Windows 更新失败 报错 0x8024401c 0x80244019 以系统管理员身份运行 net stop wuauserv reg delete f HKEY LOCAL MACHINE span class token punc
  • K8s常见面试题20问

    K8s常见面试题19问 收集了一些K8s常见问题和同学们面试常被问到的问题 如果有新的面试题私聊或者留言给我 1 Docker和虚拟机有那些不同 虚拟化环境下每个 VM 是一台完整的计算机 xff0c 在虚拟化硬件之上运行所有组件 xff0
  • Dockerfile常用命令

    Dockerfile常用命令 1 Dockerfile Dockerfile是一个文本文件 用一组指令来完成镜像的构建 每一条指令构建一层镜像 所有尽量将相同的命令合并成一行以减少中间镜像的层数 2 From 必须 指定基础镜像即我从哪里可
  • Kubesphere流水线实现蓝绿发布

    Kubesphere流水线实现蓝绿发布 1 Gitlab仓库准备 1 1 创建仓库 新建空白项目 名字随便取 greenweb 复制克隆地址 http 192 168 31 199 deploy greenweb git 1 2 初始化并上
  • 【NetWorkX实例(3)】图、边、节点等相关方法

    更全面的NetworkX中文使用手册 xff0c 请收藏 xff1a NetworkX中文使用手册 在 NetWorkX实例 1 基础操作一文中 xff0c 介绍了networkx中图的生成 xff0c 下面就介绍一下图 边 节点等相关方法
  • Python调用外部EXE程序遍历窗体及控件并获取控件信息。

    背景 我的工作中经常手工运行一个windows程序 xff08 密码生成工具 xff09 xff0c 获取该程序的计算结果 xff0c 手工填到登录表单的中 该程序非常久远 xff0c 已无人维护 根据凡是重复2次以上的工作都应该自动化原则
  • J-Link RTT Viewer使用教程(附代码)

    目录 RTT Real Time Transfer 简介 使用教程 常用API介绍 RTT缓冲大小修改 使用printf重定向 官方例程 RTT Real Time Transfer 简介 平常调试代码中使用串口打印log xff0c 往往
  • [问题记录]JNI的整型数组返回出现stack corruption

    问题记录 JNI的整型数组返回出现stack corruption 在项目中编写了一个返回整型数组的JNI代码 xff0c 但是在测试时发现问题 xff0c 会产生stack corruption错误 xff0c debug之后发现是ret