java(JNA)调用dll函数的问题

我们关注的,首先是调用函数的问题

然后是 传入参数的问题

最后是 取得返回值的问题

1.下载JNative.jar
2.把JNative.jar导入到工程,然后把JNative放入到系统的SYSTEM32下
3.把要调用的.dll文件放入到当前项目中或系统的SYSTEM32下
4.

首先,dll定义的函数如下

4.1 int  rf_init(int port,long baud);
功 能:初始化串口

参 数:port:串口号,取值为0~3

       baud:为通讯波特率9600~115200

返 回:成功则返回串口标识符>0,失败返回负值,见错误代码表

   例:int icdev;

       icdev=rf_init(0,9600);//初始化串口1,波特率9600

 
如果是WIN32程序则icdev为设备句柄,见下例:

       HANDLE icdev;

       icdev=rf_init(0,115200);

       if(icdev<0)

              MessageBox(“rf_init error”);

4.2

int rf_beep(int icdev,unsigned int _Msec);
功 能:蜂鸣

参 数:icdev:通讯设备标识符

       unsigned int _Msec:蜂鸣时间,单位是10毫秒

返 回:成功则返回 0

   例:int st;

       st=rf_beep(icdev,10);             /*鸣叫100毫秒*/

4.3

 

package com.test;

import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.pointers.Pointer;
import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;

public class TestConn {


 static Pointer pointer;
  /**
   *打开连接
  * @param port 串口号,取值为0~3
  * @param baud 通讯波特率9600~115200
  * @return 通讯设备标识符
  * @throws NativeException
  * @throws IllegalAccessException
  */
 private static final int TestConnect(int port, long baud)throws NativeException, IllegalAccessException {  
           JNative n = null;  
           try {             
               n = new JNative("mwrf32.dll", "rf_init");   //加载函数对象
               n.setRetVal(Type.INT);        //设置函数返回值类型
               int i = 0;           //设置参数顺序
               n.setParameter(i++, Type.INT, ""+port);   //设值
               n.setParameter(i++, Type.INT, "" + baud);     //设置
               System.out.println("调用的DLL文件名为:"+n.getDLLName());
               System.out.println("调用的方法名为:"+n.getFunctionName());

               n.invoke();   //调用函数
               return Integer.parseInt(n.getRetVal());   //函数返回值
          } finally {  
               if (n != null)  
                   n.dispose();         //关闭
           }  
       }

  /**
   * 创建指针,用于接收调用函数的返回值
  * @return
  * @throws NativeException
  */
 public Pointer creatPointer() throws NativeException{
 
   pointer = new Pointer(MemoryBlockFactory.createMemoryBlock(36));//分配的内存大小
   return pointer;

  }

  
 /**
  * 蜂鸣控制
  * @param icdev 通讯设备标识符
  * @param msec 蜂鸣时间,单位10毫秒
  * @return
  * @throws NativeException
  * @throws IllegalAccessException
  */
 private  String testBeep(int icdev,int msec)throws NativeException, IllegalAccessException {  
        JNative n = null;  
        try {             
            n = new JNative("mwrf32.dll", "rf_beep");   //加载函数对象
            n.setRetVal(Type.INT);        //设置函数返回值类型
            int i = 0;           //设置参数顺序
            n.setParameter(i++, icdev);
            n.setParameter(i++, msec);   //设值
            System.out.println("调用的DLL文件名为:"+n.getDLLName());
            System.out.println("调用的方法名为:"+n.getFunctionName());

            n.invoke();       //调用函数
            return n.getRetVal();    //函数返回值
    } finally {  
            if (n != null)  
                n.dispose();         //关闭
        }  
    }
 
  public static void main(String[] args)throws Exception {
   TestConn tc = new TestConn();
   Pointer po = tc.creatPointer();
   int icdev = TestConn.TestConnect(0, 115200);
//   tc.testStatus(icdev, po);
   tc.testBeep(icdev, 50);
//   System.out.println(po.getAsString());  //把接收的值转换
 }
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值