2 liangx8rx liangx8rx 于 2014.11.07 12:12 提问

java - jna 中的回调问题

在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;
    }
}
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!