liangx8rx 2014-11-07 04:12 采纳率: 0%
浏览 3559

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;
    }
}
  • 写回答

1条回答

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-21 01:52
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序