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

论坛 期权论坛 脚本     
匿名技术用户   2021-1-4 00:26   427   0

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;
 }

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

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP