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)问题解决了;