读书人

关于JNative处置dll回调函数的讨论

发布时间: 2012-10-07 17:28:51 作者: rapoo

关于JNative处理dll回调函数的讨论

网上关于JNative处理dll回调函数的例子都是一样的,但是我尝试了n次都没有成功,但是为什么那么多人都转载这个blog呢,不知道是不是我哪里弄错了,因为是第一次接触java调用dll动态库,dll中有一个回调函数;
dll说明:dll中有一个方法???
int WINAPI OpenDrive(EventProc proc, WORK_MODE mode),用于设置事件回调函数,并启动USB设备。事件回调函数原形如下:
typedef void ( CALLBACK* EventProc)(
??????????????? HANDLE Hnd,??????????????????????? //设备句柄,一个合法的设备句柄是不等于-1的整数
int eventID ,????????????????????? //事件
unsigned long param1,????????????? //下面几个参数不同的事件,其含义不同
unsigned long param2,????????????? //事件参数2
unsigned long param3,????????????? //事件参数3
unsigned long param4????????????? //事件参数4
??????????????? );
我的流程:
1.先调用OpenDrive函数,如果USB设备已插入,会有设备插入事件PLUG_IN通知上层程序;
开发环境:Netbeans 7.0.1? 使用JNative 1.3.2处理dll文件,jar包已导入
下面是我的实现代码:(主要是使用了网上流传的例子)
/*
* TestCallback.java
* 实现Callback接口
*/
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.util.Callback;
public class TestCallback implements Callback/*实现此接口*/ {
??? public TestCallback() {
??? }
??? @Override
??? public int callback(long[] values) {
??????? System.out.println("参数数量:" + values.length);
??????? if (values == null) {
??????????? System.err.println("callback ret " + 3);
??????????? return 3;
??????? } else if (values.length == 6) {
??????????? System.err.println("执行回调event!");
??????????? return 1;
??????? } else {
??????????? System.err.println("参数数量是" + values.length);
??????????? return 2;
??????? }
??? }

??? /**
???? * java回调函数地址
???? */
??? @Override
??? public int getCallbackAddress() throws NativeException {
??????? System.out.println("java回调函数地址");
??????? return JNative.createCallback(6/*回调函数参数数目*/, this);
??? }
}

/**
* TestMain.java
*
*/
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
public class TestMain {
??? public TestMain() {
??? }
??? public static void main(String[] args) {
??????? try {
??????????? JNative termcallback = new JNative("mydll", "OpenDrive");
??????????? TestCallback _mycallback = new TestCallback();
??????????? termcallback.setRetVal(Type.INT);
??????????? termcallback.setParameter(0, _mycallback.getCallbackAddress()); /*回调函数地址作为参数传递到dll*/
??????????? //调用getCallbackAddress后要调用该行代码????????????
??????????? System.err.println(JNative.releaseCallback(_mycallback));//测试打印返回值发现是false,怀疑问题是不是在这里
??????????? termcallback.setParameter(1, 0);
??????????? termcallback.invoke();
??????? } catch (Exception e) {
??????????? e.printStackTrace();
??????? }
??? }
}
调试发现usb设备插入没有获得任何事件,
System.err.println(JNative.releaseCallback(_mycallback));//测试打印返回值发现是false,怀疑问题是不是在这里

?

读书人网 >编程

热点推荐