关于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,怀疑问题是不是在这里

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值