JNA调用C++ DLL|SO库文件

本文代码 https://github.com/tothis/java-record/tree/master/src/main/java/com/example/jna

动态链接库文件文件获取手动编译动态链接库文件

import com.sun.jna.Library;
import com.sun.jna.Native;

/**
 * @author 李磊
 * @since 1.0
 */
public class CppLibraryTest {

    interface TestCppLibrary extends Library {

        // 动态链接库文件生成参考 https://github.com/tothis/cpp-record/tree/master/lib
        /**
         * 程序打包为jar时运行不同的平台查找文件名称不同
         * Windows查找 win32-x86-64/libtest-lib-shared.dll 文件
         * Linux查找 linux-x86-64/liblibtest-lib-shared.dll 文件
         */
        TestCppLibrary INSTANCE = Native.load("libtest-lib-shared", TestCppLibrary.class);

        /**
         * 数字相加
         *
         * @param a
         * @param b
         */
        int test_add(int a, int b);
    }

    public static void main(String[] args) {
        int sum = TestCppLibrary.INSTANCE.test_add(1, 2);
        System.out.println(sum);
    }
}
已标记关键词 清除标记
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; } }
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页