Java使用JNA調用DLL文件
1、什么是JNA?
JNA(Java Native Access)是一個在 Java 中調用本地代碼的開源框架,提供了一種簡單、高效的方式來訪問本地動態(tài)鏈接庫(如 .dll
、.so
文件)。
2、JNA的使用步驟
1、引入依賴
在pom.xml
文件中添加如下內容:
<dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>5.15.0</version> </dependency>
2、定義接口
精倫讀卡器官網提供了一個32位的Sdtapi.dll
文件。先在接口文件中加載此DLL文件,然后在接口文件中定義需要調用的方法。
接口需要繼承com.sun.jna.Library
。本地接口的詳細代碼如下:
import com.sun.jna.Library; import com.sun.jna.Native; /** * 精倫身份證閱讀器 */ public interface JLLibrary extends Library { JLLibrary INSTANCE = Native.load("D:\\23-demo\\Sdtapi", JLLibrary.class); /** * 打開串口 * @param port 端口號 * @return 1 - 正確;其它 - 失敗 */ int InitComm(int port); /** * 卡認證 * @return 1 - 正確;其它 - 失敗 */ int Authenticate(); /** * 讀取卡信息 * @param name 姓名 * @param gender 性別 * @param nation 民族 * @param birthday 出生日期,格式:yyyyMMdd * @param code 身份證號碼 * @param address 地址 * @param agency 簽證機關信息 * @param beginDate 有效期(起始日期) * @param endDate 有效期(結束日期) * @return 1 - 正確;其它 - 失敗 */ int ReadBaseInfos(byte[] name, byte[] gender, byte[] nation, byte[] birthday, byte[] code, byte[] address, byte[] agency, byte[] beginDate, byte[] endDate); /** * 關閉串口 * @return 1 - 正確;其它 - 失敗 */ int CloseComm(); }
方法名、參數及返回結果同精倫官方提供的對接文檔中的完全一致。
3、調用接口方法
精倫讀取器讀取身份證信息的流程:
1.打開串口 2.卡認證 3.讀取身份證信息 4.關閉串口
接下來要做的就是按照上面的步驟調用接口方法。調用接口方法的部分代碼如下:
// 1.打開串口,具體端口數值參考官方對接文檔 int deviceResult = JLLibrary.INSTANCE.InitComm(1001); if (deviceResult == 1) { // 2.卡認證 JLLibrary.INSTANCE.Authenticate(); byte[] name = new byte[31]; byte[] gender = new byte[3]; byte[] nation = new byte[10]; byte[] birthday = new byte[9]; byte[] code = new byte[19]; byte[] address = new byte[71]; byte[] agency = new byte[31]; byte[] beginDate = new byte[9]; byte[] endDate = new byte[9]; // 3.讀取基本信息 int readResult = JLLibrary.INSTANCE.ReadBaseInfos(name, gender, nation, birthday, code, address, agency, beginDate, endDate); // 解析 System.out.println(new String(name, "GBK")); System.out.println(new String(gender, "GBK")); System.out.println(new String(nation, "GBK")); System.out.println(new String(birthday, "GBK")); System.out.println(new String(code, "GBK")); System.out.println(new String(address, "GBK")); System.out.println(new String(agency, "GBK")); System.out.println(new String(beginDate, "GBK")); System.out.println(new String(endDate, "GBK")); // 4.關閉串口 deviceResult = JLLibrary.INSTANCE.CloseComm(); if (deviceResult == 1) { System.out.println("身份證閱讀器關閉成功。"); } else { System.out.println("身份證閱讀器關閉失?。?); } } else { System.out.println("身份證閱讀器打開失?。?); }
4、運行程序
運行程序這一步本身是沒有必要講述的,只是作者汪小成開發(fā)用的電腦是WIN10 64位系統(tǒng),不能調用32位的DLL文件,所以程序不能直接使用IDEA中運行。作者汪小成這里采用的方式是在將程序打成JAR,接著在開發(fā)電腦上安裝一個32位的JDK,最后使用32位的JDK運行打包后的JAR文件。
到此這篇關于Java使用JNA調用DLL文件的文章就介紹到這了,更多相關Java JNA調用DLL文件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
FutureTask為何單個任務僅執(zhí)行一次原理解析
這篇文章主要為大家介紹了FutureTask為何單個任務僅執(zhí)行一次原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11Java的外部類為什么不能使用private和protected進行修飾的講解
今天小編就為大家分享一篇關于Java的外部類為什么不能使用private和protected進行修飾的講解,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-04-04java基于正則表達式實現(xiàn)時間日期的常用判斷操作實例
這篇文章主要介紹了java基于正則表達式實現(xiàn)時間日期的常用判斷操作,簡單說明了正則表達式常用元字符含義并結合實例形式分析了java基于正則表達式針對常用日期時間格式的判斷操作技巧,需要的朋友可以參考下2017-10-10淺談virtual、abstract方法和靜態(tài)方法、靜態(tài)變量理解
下面小編就為大家?guī)硪黄獪\談virtual、abstract方法和靜態(tài)方法、靜態(tài)變量理解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02Java中字符數組、String類、StringBuffer三者之間相互轉換
這篇文章主要介紹了Java中字符數組、String類、StringBuffer三者之間相互轉換,需要的朋友可以參考下2018-05-05Spring細數兩種代理模式之靜態(tài)代理和動態(tài)代理概念及使用
代理是一種設計模式,提供了對目標對象另外的訪問方式,即通過代理對象訪問目標對象??梢圆恍薷哪繕藢ο螅瑢δ繕藢ο蠊δ苓M行拓展。在我們學習Spring的時候就會發(fā)現(xiàn),AOP(面向切面編程)的底層就是代理2023-02-02