欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java通过jna调用dll文件开发

程序员文章站 2022-07-10 15:29:55
...

调用dll所需jar包
https://mp.csdn.net/console/Editorial/15843738

示例代码只做参考,代码如下:

函数原型:
int __stdcall BYRD_GetDeviceCount(int hComm,int nID, int nIndex,unsigned int &nCount,char* pInfo)

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
/**
DLL动态库方法注入
*/
public interface CLibrary extends Library {
	
	final static String DIR = "D:/";
    CLibrary INSTANCE = (CLibrary) Native.loadLibrary(DIR+"test.dll", CLibrary.class);
    
    /**
     * @param hComm 输入参数
     * @param nID 输入参数
     * @param nIndex 输入参数
     * @param nCount 输出参数
     * @param pInfo 输出参数
     * @return 成功返回0;不成功按错误代码返回
     */
    int BYRD_GetDeviceCount(int hComm,int nID, int nIndex,IntByReference nCount, Pointer pInfo);
}
/**
 * 调用dll方法类
 * @author Lixinyou
 * @date 2021-3-12下午4:18:45
 */
public class DllUtil {
	/**
	 * 
	 * @Description 
	 * @author Lixinyou
	 * @param hComm 
	 * @param deviceNo 
	 * @return 
	 */
	public static Map<String,Integer> getDeviceCount(int deviceNo,int hComm,String deviceIp){
		Map<String, Integer> map = new HashMap<String, Integer>();
		//输出参数
		IntByReference nCount = new IntByReference();
		//输出参数
		Pointer pInfo = new Memory(32*32);//我的方法是返回的32位字符
		//获取设备统计数据
		CLibrary.INSTANCE.BYRD_GetDeviceCount(hComm,deviceNo,1,nCount,pInfo);
		int count = nCount.getValue();//设备数
		if (count == 1) {
			byte[] byteArray = pInfo.getByteArray(0, 32);
			String data;
			data = new String(byteArray);
	}

遇到的问题参考资料:

c++参数类型对应java类型:
https://blog.csdn.net/alert_Java_Song/article/details/90449748

调用成功后项目多次调用出现jvm崩溃的情况参考:https://blog.csdn.net/hcw52592/article/details/80091259

刚开始使用因为dll文件位数遇到很多坑;
接口提供方提供的是32位dll文件,我不想用,遂要求对方提供过4位的dll文件但是64位dll文件有缺陷,部分电脑能调用,服务器正巧不在能用范围,最终只能用32位的dll文件进行开发

文件路径也很重要!!!

注意!!!!
调用32dll文件必须使用32位jdk调用,64位dll文件必须用64位jdk调用

成功调用之后放到项目中,tomcat启动后调用几次函数之后jvm就崩溃了

我的jvm崩溃是因为
输出参数一开始写的是Pointer pInfo = new Memory(32);导致的;
反正我的修改成Pointer pInfo = new Memory(32*32)问题解决了;

相关标签: java