Java用JNA调用dll : Invalid memory access
问题描述
java通过JNA调用C/C++ dll时,报Invalid memory access
问题原因
经过分析原因是数据类型不匹配问题
int &a 和 a 的区别
C语言中的a是一个变量,储存着值。&a是常量,是变量a的内存地址。一般的&a是用来赋值给指针的(int *p=&a ;),或者是作为函数的参数传递(地址传递)
在java中对应&a 指针地址的引用变量为 com.sun.jna.ptr.IntByReference 或者 byte[]
代码实现
将dll 放到resources 下面
引入的 JNA 的 Maven配置
<dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>5.8.0</version></dependency>
JAVA代码实现
package com.example.demo;import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.ptr.IntByReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** jvm 64位程序执行64位dll* jvm 32位程序执行32位dll*/
@RestController
@RequestMapping("/test")
public class AddController {public interface AddLib extends Library {AddLib instance = Native.load("lib64/test", AddLib.class);//int Add1(byte[] a,byte[] b); // 对应C 语言程序 int Add1(int &a,int &b)//int Add1(Object a, Object b);// 对应C 语言程序 int Add1(int &a,int &b)int Add1(IntByReference a, IntByReference b);// 对应C 语言程序 int Add1(int &a,int &b)int Add2(int a, int b); // 对应C 语言程序 int Add1(int a,int b)}@GetMapping("/add1")public static int Add1() {Integer a = new Integer(1258);Integer b = new Integer(2);return AddLib.instance.Add1(new IntByReference(a), new IntByReference(b));
// return AddLib.instance.Add1(toLH(a),toLH(b));}@GetMapping("/add2")public int Add2() {return AddLib.instance.Add2(2, 3);}@GetMapping()public String st() {return "hello test add";}public static void main(String[] args) {int d = AddLib.instance.Add2(112, 22);System.out.println("=============" + d);d = Add1();System.out.println(d);}public static byte[] toLH(int n) {byte[] b = new byte[4];b[0] = (byte) (n & 0xff);b[1] = (byte) (n >> 8 & 0xff);b[2] = (byte) (n >> 16 & 0xff);b[3] = (byte) (n >> 24 & 0xff);return b;}public static byte[] toHH(int n) {byte[] b = new byte[4];b[3] = (byte) (n & 0xff);b[2] = (byte) (n >> 8 & 0xff);b[1] = (byte) (n >> 16 & 0xff);b[0] = (byte) (n >> 24 & 0xff);return b;}}
Java用JNA调用dll : Invalid memory access相关推荐
- 【开发者笔记】java 利用jna调用c#的dll
一.需求阐述: 如果我们的项目利用c#开发,到了开发后期需要和java组进行合作,其中有一部分业务逻辑利用c#已经code completed,那么我们可能会考虑用java来调用现成的c#dll实现需 ...
- Java利用JNA调用C#的dll
https://www.cnblogs.com/wyongbo/p/jnaTest.html 本文参考以上链接,结合自己实际遇到的问题,做过一些修改(红色字体标注),主要是为了给自己做个笔记. 一.需 ...
- java memory access_Jna报Invalid memory access错误是怎么回事?
1.各位大神,在用jna时,总是报错,如下 Exception in thread "main" java.lang.Error: Invalid memory access at ...
- 使用Jna调用dll函数库(java使用jna对接硬件接口)
记录一次项目经历,新公司开发过程中遇到了硬件对接的需求,没有接触过这方面的我一想到这些就很头大,花了几天时间来专门研究一下这个.一般硬件购买后厂家都会附赠一些开发文档,有各种语言的demo,里面其实重 ...
- 使用Java中的jna调用dll
简介: 在我们日常编码中在与硬件通信或者与其他的c++平台通信的时候经常用java调用dll文件,下面我们介绍俩种使用jna调用dll的方式. 如果是自己部门写的dll文件,一般会有头文件,头文件中会 ...
- JNA调用dll - java集成一美IP对讲SDK(dll文件)
项目需要集成一美IP对讲机,一美SDK是dll文件,其他的dll文件集成做法也类似.记录一下 准备 将一美SDK文件的DataTran.dll文件放到系统C:\Windows\System32文件夹里 ...
- JNA调用DLL函数遇到的几个问题
最近一个JSP项目需要用到分词模块,而分词模块实用C++写成的DLL库.于是上网搜各种方法,最后选择了JNA作为JSP调用DLL的工具. JNA(Java Native Access )提供一组Jav ...
- 软件开发Linux环境下,java通过JNA调用so报错,求大神解答,感激不尽。
软件开发Linux环境下,java通过JNA调用so报错,求大神解答,感激不尽. 图片说明 最佳答案: 专家已采纳 先用c等调用一下so,看函数能否正确调用 文章来源:https://ask.csdn ...
- java中通过JNA调用dll
---恢复内容开始--- 1. JNA简单介绍 先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言(尤其C/C++)写的代码进 ...
最新文章
- 几个阿里, 美团,腾讯大佬的公众号!超级变态!
- P1759 通天之潜水(不详细,勿看)(动态规划递推,组合背包,洛谷)
- 简练软考知识点整理-控制干系人参与
- 使用Storm实现WordCount
- HTTP 代理如何正确处理 Cookie
- tailf、tail -f、tail -F 指令
- java如何实现开机启动,怎样实现开机启动holer
- matlab excel 进程,Matlab使用xlsread, xlswrite函数导致excel进程无法终止的问题
- 微擎 php开发手册,目录结构
- codeforces776D
- opensips服务端搭建
- 小世界网络和复杂网络+python代码实现
- 10个超高清图片素材网站,不需要翻墙就可以直接访问
- mt7620 外置pa_openwrt在mt7620a芯片上对外置PA的支持
- awb数据怎么计算_自动白平衡(AWB)算法
- 正则表达式(regex,RE)
- 数字证书有什么作用?
- 【Word】论文的章标题以汉字编号,图、表以数字编号的实现
- java bluecove教程_Eclipse + Java + BlueCove + WIN/MAC 蓝牙开发
- MJ“点击或上拉加载更多”问题