通过JAVA进行DLL接口调用(JNA)

这两天进行开发程序,需要读取硬件厂商提供的设备数据,而对方都是以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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值