调用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() {
}
/**
* Method callback
* java对应于dll中的回调函数
* @param values
* an long[] 参数数组,非整型数代表的都是地址
* @return an int
*/
@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,怀疑问题是不是在这里
6 个解决方案
#1
没人会嘛
#2
我写碰到这问题!! 楼主解决没有!
#3
郁闷中,这问题很棘手
#4
等高手解答
#5
#6
#1
没人会嘛
#2
我写碰到这问题!! 楼主解决没有!
#3
郁闷中,这问题很棘手
#4
等高手解答