delphi中的Cast Java接口

问题描述 投票:2回答:1

感谢JNI,我尝试使用Java API在Delphi中的Android PDA上扫描条形码。我对以下代码有问题:

unit test;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,

  ZebraAPI,Android.JNI.Toast,
  Androidapi.JNI.GraphicsContentViewText,
  Androidapi.JNIBridge,
  Androidapi.Helpers, FMX.Controls.Presentation, FMX.StdCtrls,
  Androidapi.JNI.JavaTypes;

type
  TEMDKListener = class (TJavaLocal, JEMDKManager_EMDKListener)
  public
    procedure onClosed; cdecl;
    procedure onOpened(P1: JEMDKManager); cdecl;
  end;

  TStatusListener = class (TJavaLocal, JScanner_StatusListener)
  public
    procedure onStatus(P1: JStatusData); cdecl;
  end;

  TDataListener = class (TJavaLocal, JScanner_DataListener)
  public
    procedure onData(P1: JScanDataCollection); cdecl;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
    procedure onOpened(P1: JEMDKManager);
  end;


var
  Form1: TForm1;
  emdkManager: JEMDKManager;
  barcodeManager : JBarcodeManager;
  scanner: Jbarcode_Scanner;
  listenerEMDK: TEMDKListener;
  listenerData: TDataListener;
  listenerStatus: TStatusListener;

implementation

{$R *.fmx}
procedure TEMDKListener.onClosed;
begin

end;

procedure TEMDKListener.onOpened(P1: JEMDKManager);
begin
    TThread.Queue(nil,
    procedure
    begin
      Form1.onOpened(P1);
    end);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  results : JEMDKResults;
  context: JContext;
begin
    listenerEMDK := TEMDKListener.Create;
    listenerData := TDataListener.Create;
    listenerStatus := TStatusListener.Create;
    context := SharedActivityContext.getApplicationContext;
    results := TJEMDKManager.JavaClass.getEMDKManager(context,listenerEMDK);
    if results.statusCode <> TJEMDKResults_STATUS_CODE.JavaClass.SUCCESS then
      begin
        Toast('EMDKManager request Failed',false);
      end;
end;


procedure TForm1.onOpened(P1: JEMDKManager);
var
  C_BARCODE: JEMDKManager_FEATURE_TYPE;
  C_DEFAULT: JBarcodeManager_DeviceIdentifier;
  C_HARD: JScanner_TriggerType;
  base: JEMDKBase;
begin
  emdkManager := P1;
  C_BARCODE := TJEMDKManager_FEATURE_TYPE.JavaClass.BARCODE;
  C_DEFAULT := TJBarcodeManager_DeviceIdentifier.JavaClass.DEFAULT;
  C_HARD := TJScanner_TriggerType.JavaClass.HARD;
  base := emdkManager.getInstance(C_BARCODE);
  barcodeManager := JBarcodeManager(base);

  if scanner = nil then
    begin
      scanner := barcodeManager.getDevice(C_DEFAULT);
      scanner.enable();
      scanner.addDataListener(listenerData);
      scanner.addStatusListener(listenerStatus);
      scanner.triggerType := C_HARD;
      scanner.read();
      Toast('Waiting for scan ...',false);
    end;
end;

{ TStatusListener }

procedure TStatusListener.onStatus(P1: JStatusData);
begin

end;

{ TDataListener }

procedure TDataListener.onData(P1: JScanDataCollection);
begin

end;

end.

程序已编译,但是当我在PDA上执行该程序时,在此行出现分段错误:scanner := barcodeManager.getDevice(C_DEFAULT);

我认为是因为条形码管理器的强制转换不起作用:

 base := emdkManager.getInstance(C_BARCODE);
 barcodeManager := JBarcodeManager(base);

JBarcodeManager interface :
[JavaSignature('com/symbol/emdk/barcode/BarcodeManager')]
  JBarcodeManager = interface(JEMDKBase)
    ['{B4D75B89-9DD3-43BA-86D3-ACDDDD6E810F}']
    procedure addConnectionListener(P1: JBarcodeManager_ScannerConnectionListener); cdecl;
    function getDevice(P1: JBarcodeManager_DeviceIdentifier): Jbarcode_Scanner; cdecl; overload;
    function getDevice(P1: JScannerInfo): Jbarcode_Scanner; cdecl; overload;
    function getSupportedDevicesInfo: JList; cdecl;
    procedure removeConnectionListener(P1: JBarcodeManager_ScannerConnectionListener); cdecl;
  end;
  TJBarcodeManager = class(TJavaGenericImport<JBarcodeManagerClass, JBarcodeManager>) end;

教程Java在这里:http://techdocs.zebra.com/emdk-for-android/4-0/tutorial/tutBasicScanningAPI/

您有解决此问题的想法吗?

java android delphi casting java-native-interface
1个回答
0
投票

对不起,什么是ZebraAPI单位?我已经安装了Zebra SDK ...已经将所有jar导入了我的项目(Delphi 10.2)还有什么?非常感谢

© www.soinside.com 2019 - 2024. All rights reserved.