感谢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/
您有解决此问题的想法吗?
对不起,什么是ZebraAPI单位?我已经安装了Zebra SDK ...已经将所有jar导入了我的项目(Delphi 10.2)还有什么?非常感谢