在jna中使用回调函数遇到的,使用回调函数用作事件监听.问题如下
比如有两个硬件,配套了dll,单独加载时回调正常,事件能正常监听,
如
A.dll上送input事件,A.class能监听到,
B.dll上送inserted事件,B.class能监听到.
但如果在同一个项目中(同一个jvm),同时加载A.dll和B.dll时
只能监听到先加载的dll事件,后加载的则无法监听.(不触发回调)
不知道是不是jna的bug?
请问有高人能解答么?毕竟我也不太可能每一个硬件启动一个jvm,这样问题是解决了,但性能损耗和其他衍生问题会变的更麻烦.
package com.sunyard.vtm.drivers.driver;
import com.sun.jna.Callback;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sunyard.vtm.drivers.dictionary.FingerStatus;
import com.sunyard.vtm.drivers.listener.IFingerListener;
/**
* 指纹扫描仪驱动(封装dll驱动)
*
* @author Efy
*/
public class FINDriver {
/**
* 继承jna的Library接口 逻辑:
* <p>1.继承jna的Library后,注册dll库中的方法(输入参数,返回参数都必须与dll库一致)
* <p>2.如需使用回调则需要dll提供注册回调方法
*
* @author Efy
*/
public interface FinLibrary extends Library {
/**
* 启动设备
* @author Efy
*/
public abstract boolean open();
/**
* 关闭设备
* @author Efy
*/
public abstract void close();
/**
* 设备重置
* @author Efy
*/
public abstract boolean reset();
/**
* 获取设备状态
* @author Efy
*/
public abstract FingerStatus getStatus();
/**
* 获取指纹模板
* @author Efy
*/
public abstract boolean getFingerTemplete(String filePath);
/**
* 获取指纹特征
* @author Efy
*/
public abstract boolean getFingerFeature(String filePath);
/**
* 比对指纹
* @author Efy
*/
public abstract boolean compareFinger(String filePath);
/**
* 释放内存
* @author Efy
*/
public abstract void freeMemory();
/**
* 回调监听
* @author Efy
*/
public abstract void addListener(FinEventListener listener);
}
/**
* 注册回调接口监听
* @author Efy
*/
public interface FinEventListener extends Callback {
/**
* 回调接口
* @author Efy
*/
public abstract void callback(int arg0,int arg1,String data);
}
/**
* 内部类实现FinEventListener接口,处理回调事件
* 使用时,先在此驱动中声明一个监听接口,由上层set此接口的实现
*
* @author Efy
*/
public class CallBackInstance implements FinEventListener{
/**
* 回调接口
* @author Efy
*/
@Override
public void callback(int arg0,int arg1,String data){
switch (arg0) {
case 1032:
if(arg1 > 0){
iFingerListener.fingerComplete(data);
}else{
iFingerListener.fingerFail();
}
break;
case 1044:
iFingerListener.fingerMoveIn();
break;
case 1045:
iFingerListener.fingerMoveOut();
break;
}
}
}
private FINDriver() {
// 构造时装载dll
try{
lib = (FinLibrary) Native.loadLibrary("FingerLoader.dll", FinLibrary.class);
System.out.println("装载FingerLoader.dll...成功.");
}catch(UnsatisfiedLinkError e){
System.out.println("未找到FingerLoader.dll.");
return;
}
// 实例化回调接口
if (callback == null) {
callback = new CallBackInstance();
}
}
private static FinLibrary lib;
private static FINDriver instance;
private static CallBackInstance callback;
private static IFingerListener iFingerListener;
/**
* 单例模式
*
* @return
*/
public static FINDriver getInstance() {
if (instance == null){
instance = new FINDriver();
}
return instance;
}
public FinLibrary getLib() {
return lib;
}
public CallBackInstance getCallback() {
return callback;
}
public void setiFingerListener(IFingerListener iFingerListener) {
lib.addListener(callback);
FINDriver.iFingerListener = iFingerListener;
}
}