java(JNA)调用dll函数的问题
2010-09-17 11:19
309 查看
我们关注的,首先是调用函数的问题
然后是 传入参数的问题
最后是 取得返回值的问题
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()); //把接收的值转换
}
}
然后是 传入参数的问题
最后是 取得返回值的问题
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()); //把接收的值转换
}
}
相关文章推荐
- Java工作笔记:部署Tomcat时使用jni和jna调用DLL文件的问题
- Java 通过 JNA 调用 DLL 返回 char * 字符串乱码问题的解决
- JAVA调用DLL -- JNA和Fat Jar的使用及打包问题(一)
- JNA的一个小问题-调用dll处理字符串,在java中不能反映出字符串变化
- JNA调用DLL函数遇到的几个问题
- 关于vs2010下编译dll动态库,JNA接口在java中调用的问题
- JAVA调用DLL -- JNA和Fat Jar的使用及打包问题(二)
- 使用JNA调用DLL函数遇到的问题
- JAVA调用 TSC 打印机 打印中文问题/JNA中文乱码
- JAVA 通过 JNA 调用 C程序 dll 函数传入中文参数问题
- JNA调用DLL函数遇到的几个问题
- JNA调用DLL函数遇到的几个问题
- java调用linux命令传递参数问题
- java 调用 powershell 遇到的 reader.readLine() 卡住问题
- Java 中调用birt 的开发中遇到的问题和解决
- java.lang.Process调用程序阻塞问题解决
- 关于在java环境下调用 .net的 webservice无法获取参数的问题
- Java调用.Net WebService问题,以及参数为空解决办法
- java 用JNA调用dll 参考文档
- 有关java通过反射机制调用类中自有方法的问题