package com.rfid.uhf288;
|
|
import java.io.File;
|
|
/**
|
* RFID UHF288设备JNI接口
|
* 对应DLL: com_rfid_uhf288_Device.dll
|
*
|
* 参考demo项目的加载方式:在static代码块中加载DLL
|
* 注意:DLL可能不支持多线程并发访问,需要同步保护
|
*/
|
public class Device {
|
|
// DLL加载状态标志
|
private static volatile boolean libraryLoaded = false;
|
// DLL加载锁,确保只加载一次
|
private static final Object loadLock = new Object();
|
|
/**
|
* 静态代码块:加载DLL库
|
* 参考demo项目的方式,优先使用绝对路径加载,如果失败则尝试从系统PATH加载
|
*/
|
static {
|
loadLibrary();
|
}
|
|
/**
|
* 加载DLL库
|
* 优先使用绝对路径直接加载,如果失败则尝试从系统PATH加载(参考demo项目的方式)
|
* 使用同步锁确保线程安全,避免多线程同时加载导致冲突
|
*/
|
private static void loadLibrary() {
|
// 如果已经加载,直接返回
|
if (libraryLoaded) {
|
return;
|
}
|
|
// 同步加载,确保只加载一次
|
synchronized (loadLock) {
|
// 双重检查,避免重复加载
|
if (libraryLoaded) {
|
return;
|
}
|
|
String mainDllName = "com_rfid_uhf288_Device.dll";
|
String depDllName = "UHFReader288.dll"; // 依赖的DLL
|
|
// 方法1: 使用绝对路径直接加载DLL
|
try {
|
// 使用真实路径加载DLL
|
String projectBaseDir = "D:\\work\\work-zy\\zy-wcs";
|
String mainDllPath = projectBaseDir + "\\src\\main\\resources\\lib\\" + mainDllName;
|
String depDllPath = projectBaseDir + "\\src\\main\\resources\\lib\\" + depDllName;
|
|
File mainDllFile = new File(mainDllPath);
|
File depDllFile = new File(depDllPath);
|
|
if (mainDllFile.exists() && mainDllFile.canRead()) {
|
// 先尝试加载依赖DLL(如果存在)
|
if (depDllFile.exists() && depDllFile.canRead()) {
|
try {
|
System.load(depDllPath);
|
System.out.println("成功加载依赖DLL: " + depDllName + " (路径: " + depDllPath + ")");
|
} catch (UnsatisfiedLinkError e) {
|
// 依赖DLL可能已经加载过,或者加载失败
|
// 如果错误信息不是"已加载",则打印警告
|
if (e.getMessage() == null || !e.getMessage().contains("already loaded")) {
|
System.err.println("警告: 依赖DLL加载失败(继续尝试加载主DLL): " + depDllName);
|
System.err.println("错误信息: " + e.getMessage());
|
}
|
}
|
}
|
|
// 加载主DLL
|
System.load(mainDllPath);
|
System.out.println("成功从绝对路径加载DLL: " + mainDllName + " (路径: " + mainDllPath + ")");
|
System.out.println("DLL文件大小: " + mainDllFile.length() + " 字节");
|
libraryLoaded = true;
|
return;
|
} else {
|
System.err.println("DLL文件不存在或不可读: " + mainDllPath);
|
}
|
} catch (UnsatisfiedLinkError e) {
|
// 如果是依赖库错误,提供更详细的错误信息
|
if (e.getMessage() != null && e.getMessage().contains("dependent libraries")) {
|
System.err.println("DLL依赖库加载失败: " + e.getMessage());
|
System.err.println("请确保所有依赖DLL文件都在同一目录中");
|
}
|
System.err.println("从绝对路径加载DLL失败: " + e.getMessage());
|
e.printStackTrace();
|
} catch (Exception e) {
|
System.err.println("从绝对路径加载DLL失败: " + e.getMessage());
|
e.printStackTrace();
|
}
|
|
/* 方法2(已注释): 尝试从resources目录提取到临时目录加载
|
try {
|
// 创建专门的临时目录来存放所有DLL(只创建一次)
|
if (tempLibDir == null) {
|
tempLibDir = createTempLibDirectory();
|
}
|
|
if (tempLibDir != null && tempLibDir.exists()) {
|
// 先提取所有DLL到同一目录
|
File depDll = extractDllToDir("/lib/" + depDllName, depDllName, tempLibDir);
|
File mainDll = extractDllToDir("/lib/" + mainDllName, mainDllName, tempLibDir);
|
|
if (mainDll != null && mainDll.exists()) {
|
// 先尝试加载依赖DLL(如果存在)
|
if (depDll != null && depDll.exists()) {
|
try {
|
System.load(depDll.getAbsolutePath());
|
System.out.println("成功加载依赖DLL: " + depDllName + " (路径: " + depDll.getAbsolutePath() + ")");
|
} catch (UnsatisfiedLinkError e) {
|
if (e.getMessage() == null || !e.getMessage().contains("already loaded")) {
|
System.err.println("警告: 依赖DLL加载失败(继续尝试加载主DLL): " + depDllName);
|
System.err.println("错误信息: " + e.getMessage());
|
}
|
}
|
}
|
|
System.load(mainDll.getAbsolutePath());
|
System.out.println("成功从resources目录加载DLL: " + mainDllName + " (路径: " + mainDll.getAbsolutePath() + ")");
|
return;
|
}
|
}
|
} catch (Exception e) {
|
System.err.println("从resources目录加载DLL失败: " + e.getMessage());
|
e.printStackTrace();
|
}
|
*/
|
|
// 方法3: 尝试从系统PATH或java.library.path加载(参考demo项目的方式)
|
try {
|
System.loadLibrary("com_rfid_uhf288_Device");
|
System.out.println("成功从系统PATH加载DLL: " + mainDllName);
|
System.out.println("注意:如果后续native方法调用失败,请检查DLL版本是否匹配");
|
libraryLoaded = true;
|
return;
|
} catch (UnsatisfiedLinkError e) {
|
System.err.println("无法从系统PATH加载RFID设备DLL库: " + mainDllName);
|
System.err.println("错误信息: " + e.getMessage());
|
System.err.println("请确保DLL文件在系统PATH或项目lib目录中");
|
e.printStackTrace();
|
}
|
|
// 如果所有方法都失败,记录错误
|
if (!libraryLoaded) {
|
System.err.println("========================================");
|
System.err.println("RFID设备DLL加载失败!");
|
System.err.println("请检查:");
|
System.err.println("1. DLL文件是否存在: D:\\work\\work-zy\\zy-wcs\\src\\main\\resources\\lib\\com_rfid_uhf288_Device.dll");
|
System.err.println("2. DLL文件是否完整");
|
System.err.println("3. DLL文件是否在系统PATH中");
|
System.err.println("4. 从demo项目中复制正确的DLL文件");
|
System.err.println("========================================");
|
}
|
}
|
}
|
|
/**
|
* @param args
|
*/
|
public native int OpenComPort(int port,byte[]comAddr,byte baud,int[]PortHandle);
|
public native int CloseSpecComPort(int PortHandle);
|
public native int OpenNetPort(int Port,String IPaddr,byte[]comAddr,int[] PortHandle);
|
public native int CloseNetPort(int PortHandle);
|
public native int GetReaderInformation(byte[]comAddr,byte[]versionInfo,byte[]readerType,byte[]trType,byte[]dmaxfre,
|
byte[]dminfre,byte[]powerdBm,byte[]InventoryScanTime,byte[]Ant,byte[]BeepEn,
|
byte[]OutputRep,byte[]CheckAnt,int PortHandle);
|
|
public native int Inventory_G2(byte[]comAddr,byte QValue,byte Session,byte MaskMem,byte[]MaskAdr,byte MaskLen,
|
byte[]MaskData,byte MaskFlag,byte AdrTID,byte LenTID,byte TIDFlag,byte Target,
|
byte InAnt,byte Scantime,byte FastFlag,byte[]pEPCList,byte[] Ant,int[]Totallen,
|
int[]CardNum,int PortHandle);
|
|
public native int InventoryMix_G2(byte[]comAddr,byte QValue,byte Session,byte MaskMem,byte[]MaskAdr,byte MaskLen,
|
byte[]MaskData,byte MaskFlag,byte ReadMem,byte[]ReadAdr,byte ReadLen,byte[]Psd,
|
byte Target,byte InAnt,byte Scantime,byte FastFlag,byte[]pEPCList,byte[] Ant,
|
int[]Totallen,int[]CardNum,int PortHandle);
|
|
public native int ReadData_G2(byte[]comAddr,byte[] EPC,byte ENum,byte Mem,byte WordPtr,byte Num,byte[]Password,
|
byte MaskMem,byte[]MaskAdr,byte MaskLen,byte[]MaskData,byte[]Data,int[]Errorcode,
|
int PortHandle);
|
|
public native int WriteData_G2(byte[]comAddr,byte[] EPC,byte WNum,byte ENum,byte Mem,byte WordPtr,byte[] Wdt,
|
byte[]Password,byte MaskMem,byte[]MaskAdr,byte MaskLen,byte[]MaskData,int[]Errorcode,
|
int PortHandle);
|
|
public native int WriteEPC_G2(byte[]comAddr,byte[] Password,byte[] EPC,byte ENum,int[]Errorcode,int PortHandle);
|
|
public native int KillTag_G2(byte[]comAddr,byte[] EPC,byte ENum,byte[] Killpwd,byte MaskMem,byte[]MaskAdr,byte MaskLen,
|
byte[]MaskData,int[]Errorcode,int PortHandle);
|
public native int Lock_G2(byte[]comAddr,byte[] EPC,byte ENum,byte selectid,byte setprotect,byte[] Password,byte MaskMem,
|
byte[]MaskAdr,byte MaskLen, byte[]MaskData,int[]Errorcode,int PortHandle);
|
public native int BlockErase_G2(byte[]comAddr,byte[] EPC,byte ENum,byte Mem,byte WordPtr,byte Num,byte[] Password,
|
byte MaskMem,byte[]MaskAdr,byte MaskLen, byte[]MaskData,int[]Errorcode,int PortHandle);
|
public native int SetRegion(byte[]comAddr, byte dmaxfre,byte dminfre,int PortHandle);
|
public native int SetAddress(byte[]comAddr, byte ComAdrData,int PortHandle);
|
public native int SetInventoryScanTime(byte[]comAddr, byte ScanTime,int PortHandle);
|
public native int SetBaudRate(byte[]comAddr, byte baud,int PortHandle);
|
public native int SetRfPower(byte[]comAddr, byte PowerDbm,int PortHandle);
|
public native int SetWorkMode(byte[]comAddr, byte Read_mode,int PortHandle);
|
public native int GetSystemParameter(byte[]comAddr,byte[]Read_mode,byte[]Accuracy,byte[]RepCondition,byte[]RepPauseTime,
|
byte[]ReadPauseTim,byte[]TagProtocol,byte[]MaskMem,byte[]MaskAdr,byte[]MaskLen,
|
byte[]MaskData, byte[]TriggerTime,byte[]AdrTID,byte[]LenTID,int PortHandle);
|
public native int SetAntennaMultiplexing(byte[]comAddr, byte Ant,int PortHandle);
|
public native int SetAntenna(byte[]comAddr, byte SetOnce,byte AntCfg1,byte AntCfg2,int PortHandle);
|
public native int WriteRfPower(byte[]comAddr, byte PowerDbm,int PortHandle);
|
public native int ReadRfPower(byte[]comAddr, byte[] PowerDbm,int PortHandle);
|
public native int RetryTimes(byte[]comAddr, byte[] Times,int PortHandle);
|
public native int SetReadMode(byte[]comAddr, byte ReadMode,int PortHandle);
|
public native int SetCheckAnt(byte[]comAddr, byte CheckAnt,int PortHandle);
|
public native int GetSeriaNo(byte[]comAddr, byte[] SeriaNo,int PortHandle);
|
public native int SetBeepNotification(byte[]comAddr, byte BeepEn,int PortHandle);
|
public native int SetReal_timeClock(byte[]comAddr, byte[] paramer,int PortHandle);
|
public native int GetTime(byte[]comAddr, byte[] paramer,int PortHandle);
|
public native int SetDRM(byte[]comAddr, byte DRM,int PortHandle);
|
public native int GetDRM(byte[]comAddr, byte[] DRM,int PortHandle);
|
public native int GetReaderTemperature(byte[]comAddr, byte[] PlusMinus,byte[]Temperature,int PortHandle);
|
public native int MeasureReturnLoss(byte[]comAddr, byte[] TestFreq,byte Ant,byte[]ReturnLoss,int PortHandle);
|
public native int SetGPIO(byte[] comAddr, byte OutputPin, int PortHandle);
|
public native int GetGPIOStatus(byte[] ComAdr, byte[] OutputPin, int PortHandle);
|
public native int ReadActiveModeData(byte[] ScanModeData, int[] ValidDatalength, int PortHandle);
|
public native int SetRelay(byte[] comAddr, byte RelayTime, int PortHandle);
|
public native int SwitchProtocol(byte[] comAddr, byte[] protocol, int PortHandle);
|
|
public native int Inventory_JB(byte[]comAddr,byte Algo,byte MaskMem,byte[]MaskAdr,byte MaskLen,
|
byte[]MaskData,byte MaskFlag, byte InAnt,byte Scantime,byte FastFlag,byte[]pEPCList,byte[] Ant,int[]Totallen,
|
int[]CardNum,int PortHandle);
|
|
public native int InventoryMix_JB(byte[]comAddr,byte Algo,byte MaskMem,byte[]MaskAdr,byte MaskLen,
|
byte[]MaskData,byte MaskFlag,byte ReadMem,byte[]ReadAdr,byte ReadLen,byte[]Psd,
|
byte InAnt,byte Scantime,byte FastFlag,byte[]pEPCList,byte[] Ant,
|
int[]Totallen,int[]CardNum,int PortHandle);
|
|
public native int ReadData_JB(byte[]comAddr,byte[] TagID,byte TNum,byte Mem,int WordPtr,byte WordNum,byte[]Password,
|
byte MaskMem,byte[]MaskAdr,byte MaskLen,byte[]MaskData,byte[]Data,int[]Errorcode,
|
int PortHandle);
|
|
public native int WriteData_JB(byte[]comAddr,byte[] TagID,byte WNum,byte TNum,byte Mem,int WordPtr,byte[] Wdt,
|
byte[]Password,byte MaskMem,byte[]MaskAdr,byte MaskLen,byte[]MaskData,int[]Errorcode,
|
int PortHandle);
|
public native int KillTag_JB(byte[]comAddr,byte[] TagID,byte TNum,byte[] Killpwd,byte MaskMem,byte[]MaskAdr,byte MaskLen,
|
byte[]MaskData,int[]Errorcode,int PortHandle);
|
public native int Lock_JB(byte[]comAddr,byte[] EPC,byte TNum,byte LockMem,byte Cfg,byte Action,byte[] Password,byte MaskMem,
|
byte[]MaskAdr,byte MaskLen, byte[]MaskData,int[]Errorcode,int PortHandle);
|
public native int BlockErase_JB(byte[]comAddr,byte[] EPC,byte TNum,byte Mem,int WordPtr,int Num,byte[] Password,
|
byte MaskMem,byte[]MaskAdr,byte MaskLen, byte[]MaskData,int[]Errorcode,int PortHandle);
|
|
|
public native int SetCfgParameter(byte[] comAddr, byte opt, byte cfgNum, byte[]data,int len, int FrmHandle);
|
|
public native int GetCfgParameter (byte[] comAddr, byte cfgNum,byte[] data, int[] len, int FrmHandle);
|
|
public native int SetProfile(byte[] comAddr, byte[] Profile, int FrmHandle);
|
public native int SetExtProfile(byte[] comAddr,byte Opt, int[] Profile, int FrmHandle);
|
|
public native int GetEx10Version(byte[] comAddr,byte[] Version, byte[] ex10Tpye, int FrmHandle);
|
|
public static void main(String[] args) {
|
// TODO Auto-generated method stub
|
|
}
|
|
}
|