Реализовать интерфейс Java (соединенный через Delphi) в C ++ - PullRequest
0 голосов
/ 30 апреля 2018

Я хотел бы реализовать интерфейс 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;

1 Ответ

0 голосов
/ 30 апреля 2018

Определение для JBarcode2DWithSoft_ScanCallback было автоматически сгенерировано неправильно. Это должно выглядеть так:

  JBarcode2DWithSoft_ScanCallbackClass = interface(IJavaClass)
    ['{CC4376C0-AB56-4CE0-9612-C947DAE2160F}']
  end;

  [JavaSignature('com/zebra/adc/decoder/Barcode2DWithSoft$ScanCallback')]
  JBarcode2DWithSoft_ScanCallback = interface(IJavaInstance)
    ['{202711EC-3B53-469F-B6CD-C8428226565D}']
    procedure onScanComplete(P1: Integer; P2: Integer; P3: TJavaArray<Byte>); cdecl;
  end;

  TJBarcode2DWithSoft_ScanCallback = class(TJavaGenericImport<JBarcode2DWithSoft_ScanCallbackClass, JBarcode2DWithSoft_ScanCallback>) end;
...