Я хотел бы реализовать интерфейс Java (соединенный через Delphi с Java2OP) и переопределить его метод в C ++.
Ранее это было успешно выполнено в моем проекте с другим Java SDK способом, показанным ниже, который я реплицировал (2 блока кода).
Это компилируется правильно, но я получаю EJNI error
во время выполнения: "onScanComplete method not found"
.
Еще одна проблема - если я попытаюсь создать экземпляр класса TJBarcode2DWithSoft_ScanCallback
и присвоить ему TJBarcode2DWithSoft->setScanCallback(_di_JBarcode2DWithSoft_ScanCallback)
, я всегда получу ошибку:
ScanManager.cpp(147): no matching conversion for functional-style cast from 'Mca::Dev::Api::TJBarcode2DWithSoft_ScanCallback' to '_di_JBarcode2DWithSoft_ScanCallback' (aka 'DelphiInterface<Mca::Dev::Api::JBarcode2DWithSoft_ScanCallback>')
systobj.h(261): candidate constructor not viable: no known conversion from 'Mca::Dev::Api::TJBarcode2DWithSoft_ScanCallback' to 'const DelphiInterface<Mca::Dev::Api::JBarcode2DWithSoft_ScanCallback>' for 1st argument
systobj.h(268): candidate constructor not viable: no known conversion from 'Mca::Dev::Api::TJBarcode2DWithSoft_ScanCallback' to 'Mca::Dev::Api::JBarcode2DWithSoft_ScanCallback *' for 1st argument
systobj.h(254): candidate template ignored: could not match 'DelphiInterface<type-parameter-0-0>' against 'Mca::Dev::Api::TJBarcode2DWithSoft_ScanCallback'
systobj.h(278): candidate template ignored: disabled by 'enable_if' [with TArg = Mca::Dev::Api::TJBarcode2DWithSoft_ScanCallback &]
systobj.h(248): candidate constructor not viable: requires 0 arguments, but 1 was provided
Интересно, смог бы я сделать все это с локальным классом в C ++, как в Java, не передавая Delphi.
Определение ScanCallBack в SDK:
public class Barcode2DWithSoft {
...
public interface ScanCallback {
void onScanComplete(int var1, int var2, byte[] var3);
}
}
Способ Java-проекта переопределить метод интерфейса ScanCallback (без ошибок):
public Barcode2DWithSoft.ScanCallback ScanBack= new Barcode2DWithSoft.ScanCallback(){
@Override
public void onScanComplete(int i, int length, byte[] bytes) {
//Code Executed on Event
}
};
private void ScanBarcode(){
barcode2DWithSoft.scan();
barcode2DWithSoft.setScanCallback(ScanBack);
}
Использованный способ сделать это в Delphi: ScanCallBack.pas
type
TNotifyScanCompleteEvent = procedure(P1: Integer; P2: Integer; P3: TJavaArray<Byte>) of object;
TAJBarcode2DWithSoft_ScanCallback = class(TJavaLocal, JBarcode2DWithSoft_ScanCallback)
FOnScanComplet : TNotifyScanCompleteEvent;
public
procedure onScanComplete(P1: Integer; P2: Integer; P3: TJavaArray<Byte>); virtual; cdecl;
property OnScanComplet: TNotifyScanCompleteEvent read FOnScanComplet write FOnScanComplet;
end;
implementation
{ TAJBarcode2DWithSoft_ScanCallback }
procedure TAJBarcode2DWithSoft_ScanCallback.onScanComplete(P1: Integer; P2: Integer; P3: TJavaArray<Byte>);
begin
if Assigned(FOnScanComplet) then FOnScanComplet(P1,P2,P3);
end;
При использовании в моем проекте C ++
TAJBarcode2DWithSoft_ScanCallback * ScanListener = new TAJBarcode2DWithSoft_ScanCallback();
ScanListener->OnScanComplet = mca5OnScanCallBack;
this->ScanMCA5->setScanCallback(_di_JBarcode2DWithSoft_ScanCallback(*ScanListener));
РЕДАКТИРОВАТЬ:
Автоматически сгенерированное определение JBarcode2DWithSoft_ScanCallback (мост Barcode2DWithSoft.ScanCallBack) с помощью Java2OP:
JBarcode2DWithSoft_ScanCallbackClass = interface(IJavaClass)
['{CC4376C0-AB56-4CE0-9612-C947DAE2160F}']
{class} procedure onScanComplete(P1: Integer; P2: Integer; P3: TJavaArray<Byte>); cdecl;//Deprecated
end;
[JavaSignature('com/zebra/adc/decoder/Barcode2DWithSoft$ScanCallback')]
JBarcode2DWithSoft_ScanCallback = interface(IJavaInstance)
['{202711EC-3B53-469F-B6CD-C8428226565D}']
end;
TJBarcode2DWithSoft_ScanCallback = class(TJavaGenericImport<JBarcode2DWithSoft_ScanCallbackClass, JBarcode2DWithSoft_ScanCallback>) end;