这两天进行开发程序,需要读取硬件厂商提供的设备数据,而对方都是以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)
在“JNA调用DLL完整实例demo”中,我们首先需要创建一个Java接口,这个接口将代表DLL中的函数。例如,如果DLL中有一个名为`recvWork`的函数,我们的Java接口可能会这样定义: ```java public interface ...
本示例项目"JNA_Demo"应该包含了一些具体的DLL调用案例,通过阅读源码,你可以更深入地了解如何在不同情况下使用JNA调用DLL函数。实践是最好的老师,建议结合示例逐步学习和理解这些概念,以便在实际项目中灵活运用...
JNA通过提供一个接口定义,让Java代码能够映射到本地函数调用。这个接口定义包含了函数名、参数类型和返回值类型。一旦接口定义完成,JNA会自动处理底层的内存管理和参数转换,使得Java可以直接调用C风格的函数,...
在Java通过JNA调用DLL时,如果DLL函数需要一个回调函数作为参数,那么Java需要定义一个接口,该接口的方法将作为回调函数的实现,JNA会处理这个接口的调用转换。 4. **Spring Boot**:Spring Boot是基于Spring框架...
Java Native Access(JNA)是一种在Java中调用本地库(如DLL文件)的框架,无需编写C语言的桥接代码或使用Java的本机接口(JNI)。它提供了一种简单的方法来映射函数调用,数据类型和结构,使得Java开发者能够方便地...
在Java编程环境中,有时我们需要与操作系统底层功能进行交互,例如调用C语言编写的动态链接库(DLL)函数。在这种情况下,Java Native Access (JNA) 提供了一个强大的解决方案。JNA 是一个Java库,允许Java代码直接...
在Java程序中,我们可以通过JNA来调用DLL中的函数,实现跨语言的功能集成。 标题提到的"java调用dll需要的jna包"指的是两个关键的JNA组件:`jna-4.5.2.jar`和`jna-platform-4.5.2.jar`。这两个JNA版本为4.5.2的jar...
Java本身并不直接支持DLL调用,但可以通过一些第三方库来实现这一目标,例如Java Native Access(JNA)。 JNA是Java平台的一个开源库,它提供了直接访问操作系统原生API的能力,无需编写C代码或使用JNI(Java ...
本项目涉及的"java调用C++动态链接库dll接口"是解决这种跨语言交互问题的一种方法,主要利用了Java Native Interface(JNA)这一技术。 JNA是Java平台的标准库,它允许Java代码直接调用本机库(如DLL或.so文件)的...
研究java调用dll的时候,大部分都是通过jni,比较麻烦,我找到了通过jna方法调用dll的方法,用起来比较方便,只需要引用jna.jar包,这个jar包已经包含在程序中,还包含了我调用dll的遇到难道的解决办法。
通过理解JNA的工作原理,以及如何定义接口和结构体来映射原生函数,你可以轻松地在Java中调用`Kernel32.dll`或其他系统库中的函数。记住,合理使用并注意安全性和性能优化,是成功使用JNA的关键。
总结,通过JNA,我们可以方便地在Java项目中集成和调用第三方DLL,无需深入学习JNI。只需定义接口,映射DLL函数,然后加载并调用这些函数,就可以实现Java和本地代码的交互。在给定的DEMO中,我们看到了如何使用JNA...
在本例中,“java jna 调用dll例子”指的是使用JNA在Java应用程序中调用Windows上的动态链接库(DLL)文件,这里特别提到了大华SDK的Dll,这通常用于处理视频流和视频播放功能。 大华SDK( Dahua Software ...
其中一种方案是使用Java Native Access (JNA) 来调用通过C++封装的C# DLL文件。 **步骤详解:** **1. 创建C# COM组件:** - **新建项目:** 在Visual Studio中创建一个新的类库项目,并命名为`COMTest`。 - **...
为了解决上述问题,一种常见的策略是请求C++团队编写一个DLL文件来负责解析二进制数据,然后Java应用通过调用该DLL来获取解析后的结果,通常是以JSON格式返回。这就涉及到如何在Java中调用DLL的问题。 #### 方案...
自己写的dll文件,用以java jna调用测试用途自己写的dll文件,用以java jna调用测试用途自己写的dll文件,用以java jna调用测试用途自己写的dll文件,用以java jna调用测试用途
在标题"JNA java调用dll"中,我们关注的核心技术就是Java通过JNA来调用动态链接库(DLL)文件,这是在Java中实现跨平台 native 功能的一种方法。 DLL是Windows操作系统中的一个重要概念,它包含了一系列可被不同...
本教程将详述如何使用C++编写DLL动态链接库,并通过Java的Java Native Access (JNA)库进行调用,从而实现Java程序对C++功能的调用。 首先,我们需要了解DLL是什么。DLL(Dynamic Link Library)是Windows操作系统中...
这个"jna5.jar"文件是JNA的一个版本,其中包含了所有必要的组件,使得Java程序能够通过JNA接口与本地dll进行通信。 在Java中调用dll的步骤通常包括以下几点: 1. **添加JNA依赖**:首先,项目中需要引入JNA库,这...