这两天进行开发程序,需要读取硬件厂商提供的设备数据,而对方都是以DLL接口形式提供的数据访问.一般是通过JNA或者JNATIVE去与调用DLL的,第一种是实现了DLL的接口方法,第二种则是通过设置接口方法及其参数,通过INVOKE的方式进行的数据调用,我采用的是JNA来进行程序开发.
JNA(https://jna.dev.java.net/)
例子如下:
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
public class EnvironmentControl {
/** Dll of JNA interface mapping and usage. */
public interface LanBase extends Library {
LanBase INSTANCE = (LanBase) Native.loadLibrary("DsrLanProxy.dll", LanBase.class);
int CreateConnect(String strConnParam);
int DLLStartup();
int DLLCleanup();
int ReleaseConnection();
int Send(String szDeviceID, String szParam);
int TakePcCommand(int nCmdID, String szCmdParam,int nHumidityDot);
int SetCommonParam(int nCmdID, String szDeviceID, String szValue);
int TakeCommandExecuteState();
Pointer TakeCommandData();
}
public static void main(String[] args) throws Exception {
LanBase lanBase = LanBase.INSTANCE;
String strConnParam = "192.168.0.241\r\n2101";
int bConnFlag = lanBase.DLLStartup();//must run this code;
System.out.println("init the dll is " + (bConnFlag==1?"OK":"ERROR"));
int bRet = 0;
if(bConnFlag==0) return ;
bRet= lanBase.CreateConnect(strConnParam);//create the connect
System.out.println("connect is " + (bRet==1?"OK":"ERROR"));
/*
* enumCmd_TakeProductInfo = 0, // 产品信息
enumCmd_SetTemperatureUpLimit = 18, // 设置温度上限
enumCmd_SetTemperatureLowLimit = 19,// 设置温度下限
enumCmd_SetHumidityUpLimit = 20, // 设置湿度上限
enumCmd_SetHumidityLowLimit = 21, // 设置湿度下限
enumCmd_BackStandby = 25, // 开始记录
enumCmd_StartRecord = 26, // 停止记录
enumCmd_cmdTakeRecordSet = 33, // 获取记录参数设置
enumCmd_cmdTakeRecordData = 34, // 获取记录数据
enumCmd_cmdTakeParamSet = 36, // 获取普通工作参数
enumCmd_cmdDownLoadAck = 37, // 下载记录时的确认
enumCmd_cmdReadSensor = 38, // 获取实时数据
*/
long nCommandRet = lanBase.TakePcCommand(38, "TH0807220812LA", 1);//send the command
System.out.println("read date command is " + (nCommandRet==1?"OK":"ERROR"));
int m_LastSendRet;//the command execute state
m_LastSendRet = lanBase.TakeCommandExecuteState();//get the command state when return 1 is ok
int nTimeOut=0,LanCommTimeOut = 1000;
while ( m_LastSendRet == 4)//the command is free
{
m_LastSendRet = lanBase.TakeCommandExecuteState();
if (nTimeOut++ < LanCommTimeOut)
{
Thread.sleep(20);
m_LastSendRet = lanBase.TakeCommandExecuteState();
}
else
{
break;
}
}
System.out.println("the command execute result is " + (m_LastSendRet==1?"OK":"ERROR"));
Pointer pointer = lanBase.TakeCommandData();
String strResult = pointer.getString(0);
System.out.println(strResult);
}
}
参考网址是:https://jna.dev.java.net/javadoc/overview-summary.html
分享到:
相关推荐
java调用C#封装的dll(jna,com)java调用C#封装的dll(jna,com)java调用C#封装的dll(jna,com)
亲测可用,java 成功调用dll函数。包含调用回调函数,springboot版本。最近由于公司业务需要,要调用dll文件,用JNA调用。
自己写的dll文件,用以java jna调用测试用途自己写的dll文件,用以java jna调用测试用途自己写的dll文件,用以java jna调用测试用途自己写的dll文件,用以java jna调用测试用途
MyEclipse 6.5 导入就可测试 绝对能跑起来 实现 java 通过 jna 包 调用dll
jna调用dll实例,包含jna.jar包,有详细的调用过程注释,包括调用时的中文乱码处理。本实例还提供了32位和64位的dll试用文件。
研究java调用dll的时候,大部分都是通过jni,比较麻烦,我找到了通过jna方法调用dll的方法,用起来比较方便,只需要引用jna.jar包,这个jar包已经包含在程序中,还包含了我调用dll的遇到难道的解决办法。
2个包,jna-4.5.2.jar,jna-platform-4.5.2.jar。java调用dll需要的2个jar包,我pi数据库调用dll的时候,需要用到这2个包,亲测通过。
问题描述: 在开发项目过程中,需要处理算法分析出来二进制流数据,并对数据解析处理转发。我们上层应用平台是使用java开发的...那现在上层应用面临的问题:访问java外部功能接口实现方式(即调用dll)怎么选择及实现?
实例中演示了各种参数形式的DLL函数调用,如:基本数据类型、基本数据类型的指针和引用、结构体、结构体的指针和引用、函数指针和回调函数、字符串指针、输入数组、输出数组等,非常实用。
JNA方式实现Java调用dll的必用jar包
This document is the API specification for the JNA library for simplified native library access for Java.
我们知道,使用 JNI 调用 .dll/.so 共享类库是非常非常麻烦和痛苦...使用 JNA ,不需要再编写适配用的 .dll/.so ,只需要在 Java 中编写一个接口和一些代码,作为 .dll/.so 的代理,就可以在 Java 程序中调用 dll/so 。
jna调用dll省去烦人的JNI编写,并且实现了自定义接口事件,实现C回调java
java后端springBoot框架使用jna调取C语言的dll接口(停车场道闸接口) 包含构造体的调用, 回调函数的调用,JNA和C / C ++的数据类型映射,Pointer类型的使用
java 调用dll 最简单的方式,完全不用开发c++代码,简单易用。
包含jna.jar 并且有一个完整的使用例子。该例子直接调用msvcrt这个进行输出。
jna是在java开发环境中调用dll等外源包的工具之一,目前的最新版本是5.1.0
一个将C++头文件转JAVA JNA接口类的工具类,方便java程序调用C++ DLL的接口
Java通过JNA调用系统API示例,调用 Kernel32.dll文件中的GetLocalTime(),GetSystemTime(),SetLocalTime()方法。
jna 3.3.0 java 调用 dll/so