`
leng_cn
  • 浏览: 298429 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

通过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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics