吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 638|回复: 5
收起左侧

[其他求助] 华大HD-S1读卡器二次开发求助2

[复制链接]
lysuro 发表于 2024-3-29 13:19
200吾爱币
本帖最后由 lysuro 于 2024-3-29 13:21 编辑

继求助1后, 边学Java边百度. 抄抄改改了一段代码, 还是不过关, 请指教!


package org.example;

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

import java.io.File;


public class Example {
    public interface Device_Open extends Library {

        long device_Open(String szPort);

        Device_Open Instance = (Device_Open) Native.loadLibrary("device_Open", Device_Open.class);

    }

    //dll文件在lib下
    static {
        File file = new File("src/main/resources/lib/NaturalCard.dll");
        System.load(file.getAbsolutePath());

    }

    //测试
    public static void main(String[] args) {
        String usb = "USB";
        System.out.println("完成");
        System.out.println(Device_Open.Instance.device_Open(usb));

    }
}

最佳答案

查看完整内容

import com.sun.jna.Library; import com.sun.jna.Native; public interface DeviceOpen extends Library { DeviceOpen INSTANCE = (DeviceOpen ) Native.loadLibrary( "NaturalCard", DeviceOpen .class);//NaturalCard.dll 放到工程路径下 跟src文件夹同级 //USB设备传入”USB”,串口设备传入”COM1” “COM2”等等 long device_Open(String szPort); } 调用方法: private void openDevice() { ...

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

总有bug想害朕 发表于 2024-3-29 13:19
import com.sun.jna.Library;
import com.sun.jna.Native;

public interface DeviceOpen  extends Library {

        DeviceOpen  INSTANCE = (DeviceOpen ) Native.loadLibrary(
                        "NaturalCard", DeviceOpen .class);//NaturalCard.dll 放到工程路径下  跟src文件夹同级

         //USB设备传入”USB”,串口设备传入”COM1” “COM2”等等
         long device_Open(String szPort);

        }
调用方法:
        private void openDevice() {
                 DeviceOpen.INSTANCE.device_Open("USB");
        }

免费评分

参与人数 1热心值 +1 收起 理由
lysuro + 1 热心回复!谢谢

查看全部评分

 楼主| lysuro 发表于 2024-3-29 17:50
总有bug想害朕 发表于 2024-3-29 14:22
import com.sun.jna.Library;
import com.sun.jna.Native;

装了个64位JDK, 半天没反应过来, 哈哈.


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

public class Example {
    public interface DeviceOpen  extends Library {

        DeviceOpen  INSTANCE = (DeviceOpen ) Native.loadLibrary(
                "NaturalCard", DeviceOpen .class);//NaturalCard.dll 放到工程路径下  跟src文件夹同级

        //USB设备传入”USB”,串口设备传入”COM1” “COM2”等等
        long device_Open(String szPort);
    }
    //调用方法:
    private void openDevice() {
        DeviceOpen.INSTANCE.device_Open("USB");
    }

    //测试
    public static void main(String[] args) {
        System.out.println("完成");
        System.out.println(DeviceOpen.INSTANCE.device_Open("USB"));
    }
}

结果如下:

完成
12884901877

进程已结束,退出代码为 0

请问这是打开设备成功吗?
还有我感觉我的main方法有点怪怪的.
h7867 发表于 2024-3-29 18:14
您好!看起来您正在尝试使用Java的JNA库来调用一个名为NaturalCard.dll的动态链接库(DLL)中的函数device_Open。首先,确保NaturalCard.dll确实包含了这个函数,并且这个函数的签名与您在Device_Open接口中定义的一致(即它应该接受一个字符串参数并返回一个长整型值)。

在您的代码中,您已经正确地加载了DLL文件,并声明了一个接口Device_Open来映射DLL中的函数。但是,有几个可能的问题需要注意:

DLL路径:确保NaturalCard.dll文件确实位于src/main/resources/lib/目录下,并且这个目录是项目构建路径的一部分。在构建过程中,DLL文件应该被复制到类路径(classpath)中的合适位置,以便Java可以加载它。

异常处理:在调用System.load()时,如果DLL文件加载失败,会抛出UnsatisfiedLinkError异常。您应该添加异常处理代码来捕获并处理这种可能的错误。

函数名大小写:确保DLL中函数的名称和您在Java接口中声明的名称完全匹配,包括大小写。

函数参数和返回类型:确保DLL中函数的参数类型和返回类型与您在Java接口中声明的一致。

DLL的位数:确保您的DLL文件(32位或64位)与您的Java运行时环境(JRE)的位数相匹配。

下面是一个更新后的代码示例,添加了异常处理:(下面代码。不知道在这没上有正确发布,我会重新给你发一个。没有正确发货?)

[Asm] 纯文本查看 复制代码
package org.example;

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

public class Example {
    public interface Device_Open extends Library {
        long device_Open(String szPort);
    }

    static {
        String libraryName = Platform.isWindows() ? "NaturalCard" : "NaturalCard.so"; // 根据平台选择合适的库名
        String libraryPath = "path/to/your/lib/directory/"; // 修改为DLL文件所在的目录
        System.setProperty("jna.library.path", libraryPath);
        try {
            Device_Open.Instance = (Device_Open) Native.load(libraryName, Device_Open.class);
        } catch (UnsatisfiedLinkError e) {
            System.err.println("无法加载DLL: " + e.getMessage());
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        String usb = "USB";
        try {
            long result = Device_Open.Instance.device_Open(usb);
            System.out.println("device_Open函数返回: " + result);
        } catch (Exception e) {
          




请注意,您需要将path/to/your/lib/directory/替换为NaturalCard.dll文件实际的路径。此外,我还添加了平台检查来选择正确的库名(在Windows上通常是.dll,在Unix-like系统上可能是.so)。

如果修改后仍然遇到问题,请检查DLL文件是否损坏、是否包含所需的函数、以及是否有其他依赖项未满足。此外,确保您的Java环境配置正确,并且您有权访问和加载DLL文件。
h7867 发表于 2024-3-29 18:15
您好!看起来您正在尝试使用Java的JNA库来调用一个名为NaturalCard.dll的动态链接库(DLL)中的函数device_Open。首先,确保NaturalCard.dll确实包含了这个函数,并且这个函数的签名与您在Device_Open接口中定义的一致(即它应该接受一个字符串参数并返回一个长整型值)。

在您的代码中,您已经正确地加载了DLL文件,并声明了一个接口Device_Open来映射DLL中的函数。但是,有几个可能的问题需要注意:

DLL路径:确保NaturalCard.dll文件确实位于src/main/resources/lib/目录下,并且这个目录是项目构建路径的一部分。在构建过程中,DLL文件应该被复制到类路径(classpath)中的合适位置,以便Java可以加载它。

异常处理:在调用System.load()时,如果DLL文件加载失败,会抛出UnsatisfiedLinkError异常。您应该添加异常处理代码来捕获并处理这种可能的错误。

函数名大小写:确保DLL中函数的名称和您在Java接口中声明的名称完全匹配,包括大小写。

函数参数和返回类型:确保DLL中函数的参数类型和返回类型与您在Java接口中声明的一致。

DLL的位数:确保您的DLL文件(32位或64位)与您的Java运行时环境(JRE)的位数相匹配。

下面是一个更新后的代码示例,添加了异常处理:

java
复制
package org.example;

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

public class Example {
    public interface Device_Open extends Library {
        long device_Open(String szPort);
    }

    static {
        String libraryName = Platform.isWindows() ? "NaturalCard" : "NaturalCard.so"; // 根据平台选择合适的库名
        String libraryPath = "path/to/your/lib/directory/"; // 修改为DLL文件所在的目录
        System.setProperty("jna.library.path", libraryPath);
        try {
            Device_Open.Instance = (Device_Open) Native.load(libraryName, Device_Open.class);
        } catch (UnsatisfiedLinkError e) {
            System.err.println("无法加载DLL: " + e.getMessage());
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        String usb = "USB";
        try {
            long result = Device_Open.Instance.device_Open(usb);
            System.out.println("device_Open函数返回: " + result);
        } catch (Exception e) {
            System.err.println("调用device_Open函数时出错: " + e.getMessage());
            e.printStackTrace();
        }
    }
}


请注意,您需要将path/to/your/lib/directory/替换为NaturalCard.dll文件实际的路径。此外,我还添加了平台检查来选择正确的库名(在Windows上通常是.dll,在Unix-like系统上可能是.so)。

如果修改后仍然遇到问题,请检查DLL文件是否损坏、是否包含所需的函数、以及是否有其他依赖项未满足。此外,确保您的Java环境配置正确,并且您有权访问和加载DLL文件。

免费评分

参与人数 1吾爱币 +1 收起 理由
lysuro + 1 热心回复!多谢提醒, 确实jdk和dll位数不同调试了好一会儿.

查看全部评分

 楼主| lysuro 发表于 2024-3-29 21:20
总有bug想害朕 发表于 2024-3-29 14:22
import com.sun.jna.Library;
import com.sun.jna.Native;

还有两个问题请教一下, 谢谢!
问题1: 调用Dll中多个函数怎么写? 应用场景,打开,发声,读卡,关闭.long device_Beep(), long device_Close().
问题2: 调用多个Dll怎么写? 应用场景,读身份证时还须用到WltRS.dll

百度上全是单个Dll和单个函数的示例
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-11 17:24

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表