简单的eclipse应用jna入门和实例

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

https://maven.java.net/content/repositories/releases/net/java/dev/jna/jna-platform/4.0.0/jna-platform-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;
	}

}
添加工具类,实现相关接口,实现自动回调函数

猜你喜欢

转载自blog.csdn.net/qq_29048719/article/details/76229421
jna