网上关于JNative处理dll回调函数的例子

时间:2022-09-06 14:09:16
网上关于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() {
    }

    /**
     * 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


网上关于JNative处理dll回调函数的例子

#6


网上关于JNative处理dll回调函数的例子

#1


没人会嘛

#2


我写碰到这问题!! 楼主解决没有!

#3


郁闷中,这问题很棘手

#4


等高手解答

#5


网上关于JNative处理dll回调函数的例子

#6


网上关于JNative处理dll回调函数的例子