NA全称Java Native Access,是一个建立在经典的JNI技术之上的Java开源框架(https://github.com/twall/jna)。JNA提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。
JNA包:
https://maven.java.net/content/repositories/releases/net/java/dev/jna/jna/4.0.0/jna-4.0.0.jar
在eclipse的项目中引入jar包
调用c++底层接口函数
1.加入dll
2创建和c++结构体对应的接口和类
import java.util.ArrayList;
import java.util.List;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Structure;
import com.sun.jna.platform.win32.WTypes.BSTR;
public interface VideoOCR extends Library {
public static final VideoOCR instance = (VideoOCR) Native.loadLibrary("VideoOCR", VideoOCR.class);
public class DLL_MRZDATA extends Structure {
public BSTR RawMRZ;
public BSTR DocumentNumber;
public BSTR DOB;
public BSTR Expiry;
public BSTR Issuer;
public BSTR Nationality;
public BSTR LastNames;
public BSTR FirstNames;
public BSTR Type;
public BSTR Discretionary1;
public BSTR Discretionary2;
public BSTR Gender;
@Override
protected List getFieldOrder() {
ArrayList<String> list = new ArrayList<String>();
list.add("RawMRZ");
list.add("DocumentNumber");
list.add("DOB");
list.add("Expiry");
list.add("Issuer");
list.add("Nationality");
list.add("LastNames");
list.add("FirstNames");
list.add("Type");
list.add("Discretionary1");
list.add("Discretionary2");
list.add("Gender");
return list;
}
}
public boolean voInitialiseReader(boolean InfraRed, boolean Colour, boolean UV, boolean RFID, boolean AutoStop);
public boolean voStartRead();
public boolean voStopRead();
public boolean voQueryReaderState(DLL_STATUS Status);
public void voFaceDetectImageCallback(LPVOID Parameter, int ImageType, BitSet hBitmap);
public boolean voRegisterMrzCallback(voDataCall Callback, LPVOID Parameter);
public boolean voRegisterImageCallback(voImageCall Callback, LPVOID Parameter);
public boolean voRegisterBadDecodeCallback(voBadDecodeCall Callback, LPVOID Parameter);
public boolean voRegisterFaceDetectImageCallback(voFaceDetectImageCall callback, LPVOID parameter);
public boolean voBadDecodeImageType(boolean Infrared, boolean Colour, boolean UV, boolean GREY);
public boolean voSetFaceDetectionBorder(float xPercentage, float yPercenatge);
public interface voDataCall extends StdCallCallback {
public abstract void voDataCallback(LPVOID Parameter, DLL_MRZDATA Data);
}
public boolean voGetImage(int ImageType, boolean FullSize);
public interface voImageCall extends StdCallCallback {
public void voImageCallback(LPVOID Parameter, int ImageType, HBITMAP hBitmap);
}
public interface voBadDecodeCall extends Callback {
public void voBadDecodeCallback(LPVOID Parameter, BSTR BadMRZ, HBITMAP hBitmap);
}
public interface voFaceDetectImageCall extends StdCallCallback {
public void voFaceDetectImageCallback(LPVOID Parameter, int ImageType, HBITMAP hBitmap);
}
public boolean voTerminate();
}
DLL_MRZDATA为c++语言中对应的 结构体
下面为c++中对应的接口
package com.jna.ocr;
import java.util.LinkedList;
import com.jna.ocr.VideoOCR.DLL_MRZDATA;
import com.jna.ocr.VideoOCR.DLL_STATUS;
import com.jna.ocr.VideoOCR.voBadDecodeCall;
import com.jna.ocr.VideoOCR.voDataCall;
import com.jna.ocr.VideoOCR.voImageCall;
import com.sun.jna.platform.win32.WinDef.HBITMAP;
import com.sun.jna.platform.win32.WinDef.LPVOID;
public class VideoOCRUtil {
private voDataCall md;
private voImageCall id;
private voBadDecodeCall bd;
private DLL_STATUS status;
public voDataCall getMd() {
return md;
}
public void setMd(voDataCall md) {
this.md = md;
}
public voImageCall getId() {
return id;
}
public void setId(voImageCall id) {
this.id = id;
}
public voBadDecodeCall getBd() {
return bd;
}
public void setBd(voBadDecodeCall bd) {
this.bd = bd;
}
public DLL_STATUS getStatus() {
return status;
}
public void setStatus(DLL_STATUS status) {
this.status = status;
}
public void setRFIDPresent(boolean rFIDPresent) {
RFIDPresent = rFIDPresent;
}
public void setRFIDecoded(boolean rFIDecoded) {
RFIDecoded = rFIDecoded;
}
public void setPassportPresent(boolean passportPresent) {
this.passportPresent = passportPresent;
}
public void setMRZDecoded(boolean mRZDecoded) {
MRZDecoded = mRZDecoded;
}
public VideoOCRUtil() {
md = new MRZDelegateImpl();
id = new ImageDelegateImpl();
bd = new BadDecodDelegateImpl();
status = new DLL_STATUS();
}
public boolean voRegisterImageCallback(voImageCall imageDelegate, LPVOID val) {
boolean result = VideoOCR.instance.voRegisterImageCallback(imageDelegate, val);
return result;
}
public boolean voRegisterMrzCallback(voDataCall imageDelegate, LPVOID val) {
boolean result = VideoOCR.instance.voRegisterMrzCallback(imageDelegate, val);
return result;
}
public boolean voRegisterBadDecodCallback(voBadDecodeCall badDecodeDelegate, LPVOID val) {
boolean result = VideoOCR.instance.voRegisterBadDecodeCallback(badDecodeDelegate, val);
return result;
}
public void startReader() {
boolean isStarted = VideoOCR.instance.voStartRead();
System.out.println("If The reader is Started?===>" + isStarted);
}
public void testStartReader() {
Boolean boo = VideoOCR.instance.voStartRead();
System.out.println("wether start read:" + boo);
}
public void getIRImage() {
// Takes a colour image of whats on scanner plate
VideoOCR.instance.voGetImage(0, true);
}
public void getColourImage() {
// Takes a colour image of whats on scanner plate
VideoOCR.instance.voGetImage(1, true);
}
public void getUVImage() {
VideoOCR.instance.voGetImage(2, true);
}
public boolean getScannerStatus() {
boolean returnValue = VideoOCR.instance.voQueryReaderState(status);
return returnValue;
}
public void queryReaderState() {
boolean boo = VideoOCR.instance.voQueryReaderState(status);
System.out.println("当前输入状态是否已经更新:" + status);
}
public void testInitialiseReader() {
boolean boo = VideoOCR.instance.voInitialiseReader(true, true, true, true, false);
System.out.println("初始化成功:" + boo);
Boolean b = voRegisterImageCallback(id, null);
Boolean a = voRegisterMrzCallback(md, null);
Boolean c = voRegisterBadDecodCallback(bd, null);
System.out.println("a:" + a + " b:" + b);
}
public void initialiseReader() {
// Start up the reader
// Set up capture of all illumination types and RFID
VideoOCR.instance.voInitialiseReader(true, true, true, true, false);
LPVOID Val = new LPVOID(0);
LPVOID Val1 = new LPVOID(1);
LPVOID Val2 = new LPVOID(2);
voRegisterMrzCallback(md, Val);
System.out.println("image id:" + id);
voRegisterImageCallback(id, Val1);
voRegisterBadDecodCallback(bd, Val2);
}
public void reInitialiseReader() {
// Terminates all the process threads and goes into an ide state
VideoOCR.instance.voTerminate();
// Set up capture of all illumination types and RFID
VideoOCR.instance.voInitialiseReader(true, true, true, true, false);
LPVOID Val = new LPVOID();
voRegisterMrzCallback(md, Val);
voRegisterImageCallback(id, Val);
// startReader();
}
public boolean RFIDPresent;
public boolean RFIDecoded;
public boolean busy;
public boolean passportPresent;
public boolean documentPresent;
public boolean MRZDecoded;
public boolean isRFIDPresent() {
return status.RFIDPresent;
}
public boolean isRFIDecoded() {
return status.RFIDDecoded;
}
public boolean isBusy() {
return status.Busy;
}
public boolean isPassportPresent() {
return status.PassportPresent;
}
public boolean isDocumentPresent() {
return status.DocumentPresent;
}
public boolean isMRZDecoded() {
return status.MRZDecoded;
}
}
添加工具类,实现相关接口,实现自动回调函数