当前位置:首页 » 《资源分享》 » 正文

报错invalid memory access -- Java调用JNA

17 人参与  2024年03月28日 11:45  分类 : 《资源分享》  评论

点击全文阅读


一、错误概述

"Invalid memory access"是Java中使用JNA(Java Native Access)调用本地库时可能出现的错误之一。

二、错误原因

内存越界
在访问本地内存时,如果超出了允许的范围,就会导致无效的内存访问。这可能是由于传递给本地函数的参数有误,或者在访问返回的数据时发生了错误。内存释放错误
如果在使用本地内存之后,不正确地释放或管理内存,就可能导致无效的内存访问。确保在不再需要使用本地内存时,正确地释放它。数据类型不匹配
JNA通过Java和本地代码之间的数据转换来实现交互,如果数据类型在转换过程中不匹配,就可能导致无效的内存访问。确保在声明和使用本地函数、结构体或指针时,数据类型是正确匹配的。

三、解决方法

1、数据类型不匹配

数据对应关系
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
建议使用对应的ByReference对象替代Pointer,使用Pointer有时可能会得到一个垃圾值(正常情况下两种方式结果一样),如果C中函数执行失败时没有对指针的值进行处理,使用Pointer就会得到一个垃圾值

将int*和 IntByReference对应的例子

import com.sun.jna.Library;import com.sun.jna.Native;import com.sun.jna.ptr.IntByReference;public interface MyLibrary extends Library {    MyLibrary INSTANCE = Native.load("mylibrary", MyLibrary.class);    void myFunction(IntByReference intValue);}public class Main {    public static void main(String[] args) {        MyLibrary myLibrary = MyLibrary.INSTANCE;        IntByReference intValue = new IntByReference(0);        myLibrary.myFunction(intValue);                int result = intValue.getValue();        System.out.println("Result: " + result);    }}

一个将double*和Pointer对应的例子

import com.sun.jna.Library;import com.sun.jna.Native;import com.sun.jna.Pointer;public interface MyLibrary extends Library {    MyLibrary INSTANCE = (MyLibrary) Native.load("mylibrary", MyLibrary.class);    // 假设C语言中的函数原型为:void processDoubles(double* data, int length);    void processDoubles(Pointer data, int length);}public class Main {    public static void main(String[] args) {        // 准备一些数据        double[] inputData = {1.0, 2.0, 3.0, 4.0};        int length = inputData.length;        // 将数据拷贝到本地内存,并获取一个指向该内存块的指针        Pointer pointer = new Memory(inputData.length * Native.getNativeSize(Double.TYPE));        //Double[] doubles = new Double[]{};        //将Double[]转换成double[]        //double[] primitiveArray = Arrays.stream(doubles).mapToDouble(Double::doubleValue).toArray();        pointer.write(0, inputData, 0, inputData.length);        // 调用C语言函数        MyLibrary.INSTANCE.processDoubles(pointer, length);    }}

2、内存错误

保在使用本地内存之前和之后,正确地分配和释放内存。可以使用JNA提供的内存管理方法来处理内存。
这个错误的地方无法预判,可以看下面文章,一次内存上的问题的解决方案
记一次JNA踩坑历程 – JNA


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/87032.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 进错房,嫁给八零最牛特种兵已完结(林晚夏江肆年)抖音热文_《进错房,嫁给八零最牛特种兵已完结》最新章节免费在线阅读 -
  • 重生后选魔族,天族哭着求我当王全章节(月沁雪任意)全文免费阅读无弹窗大结局_(重生后选魔族,天族哭着求我当王全章节)重生后选魔族,天族哭着求我当王全章节免费阅读全文最新章节列表_笔趣阁(重生后选魔族,天族哭着求我当王全章节) -
  • 捡回摄政王后,她在皇室作威作福完结版小说(景飞鸢赵灵杰)全文免费阅读无弹窗大结局_(捡回摄政王后,她在皇室作威作福完结版免费阅读全文大结局)最新章节列表_笔趣阁(捡回摄政王后,她在皇室作威作福完结版) -
  • 千金难泣(立轩苏子骞翠竹吴进)全本免费在线阅读_千金难泣最新章节在线阅读(立轩苏子骞翠竹吴进)
  • 《沈云阶傅宴辞》(沈云阶傅宴辞》已完结完整版全集大结局小说)全文阅读笔趣阁
  • 《沈凌峰沈国华》已完结小说全文阅读笔趣阁《沈凌峰沈国华》
  • 《傅嫤韩恬魏郯程茂》已完结(傅嫤韩恬魏郯程茂)热门小说全目录完整版)全文阅读笔趣阁
  • 八零俏军医错嫁糙汉军官:番外+全文+后续(贺昭朗孟翩然)完本小说免费_全本免费小说八零俏军医错嫁糙汉军官:番外+全文+后续最新小说全文阅读(贺昭朗孟翩然)
  • 失去千千万万遍在线阅读(阮相宜陆凛言)全文免费阅读无弹窗大结局_(失去千千万万遍在线阅读)失去千千万万遍在线阅读免费阅读全文最新章节列表_笔趣阁(失去千千万万遍在线阅读) -
  • 脱离世界后,妻子疯了火爆小说小说(沈夕颜林程言)全文免费阅读无弹窗大结局_(脱离世界后,妻子疯了火爆小说免费阅读全文大结局)最新章节列表_笔趣阁(脱离世界后,妻子疯了火爆小说) -
  • 跨年发生踩踏,男友为救白月光丢下我(温林初宝宝)免费阅读 -
  • 都重生了,还不离婚等啥呢宋招弟霍文铮小说在线章节免费阅读

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1