在C+中实现Java接口(通过Delphi桥接)+; 我想实现一个java接口(通过Delphi与Java2Op桥接)并在C++中重写它的方法。p>

在C+中实现Java接口(通过Delphi桥接)+; 我想实现一个java接口(通过Delphi与Java2Op桥接)并在C++中重写它的方法。p>,java,android,delphi,c++builder,Java,Android,Delphi,C++builder,这是以前在我的项目中使用另一个Java SDK成功完成的,我复制了下面所示的方式(2个代码块) 这是正确的编译,但我在运行时遇到了一个EJNI错误:“找不到onScanComplete方法” 另一个问题是,如果我尝试实例化Tjbarcode2WithSoft\u ScanCallback类并将其交给Tjbarcode2WithSoft->setScanCallback(\u di\u jbarcode2WithSoft\u ScanCallback),我将始终得到错误: ScanManager.

这是以前在我的项目中使用另一个Java SDK成功完成的,我复制了下面所示的方式(2个代码块)

这是正确的编译,但我在运行时遇到了一个
EJNI错误
“找不到onScanComplete方法”

另一个问题是,如果我尝试实例化
Tjbarcode2WithSoft\u ScanCallback
类并将其交给
Tjbarcode2WithSoft->setScanCallback(\u di\u jbarcode2WithSoft\u 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
重写ScanCallback接口方法的Java项目方式(无错误):

public class Barcode2DWithSoft {
    ...
    public interface ScanCallback {
            void onScanComplete(int var1, int var2, byte[] var3);
    }
}
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);
}
  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;

使用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;

编辑:

通过Java2OP自动生成JBarcode2DWithSoft\u ScanCallback(Barcode2DWithSoft.ScanCallback的桥)的定义:

public class Barcode2DWithSoft {
    ...
    public interface ScanCallback {
            void onScanComplete(int var1, int var2, byte[] var3);
    }
}
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);
}
  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;
JBarcode2DWithSoft\u ScanCallbackClass=接口(IJavaClass)
[{CC4376C0-AB56-4CE0-9612-C947DAE2160F}]
{class}过程onScanComplete(P1:Integer;P2:Integer;P3:TJavaArray);cdecl//不赞成
结束;
[JavaSignature('com/zebra/adc/decoder/Barcode2DWithSoft$ScanCallback')]
JBarcode2DWithSoft_ScanCallback=接口(IJavaInstance)
[{202711EC-3B53-469F-B6CD-C842822665D}]
结束;
TJBarcode2WithSoft_ScanCallback=类(TJavaGenericImport)结束;

自动生成的jbarcode2withsoft_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;
JBarcode2DWithSoft\u ScanCallbackClass=接口(IJavaClass)
[{CC4376C0-AB56-4CE0-9612-C947DAE2160F}]
结束;
[JavaSignature('com/zebra/adc/decoder/Barcode2DWithSoft$ScanCallback')]
JBarcode2DWithSoft_ScanCallback=接口(IJavaInstance)
[{202711EC-3B53-469F-B6CD-C842822665D}]
过程onscanplete(P1:Integer;P2:Integer;P3:TJavaArray);cdecl;
结束;
TJBarcode2WithSoft_ScanCallback=类(TJavaGenericImport)结束;

考虑的函数之一提到了
const
-我想知道这是否是问题所在?没有tsure Though…这可以在没有Delphi桥接器的情况下完成。您还没有包含JBarcode2WithSoft定义的代码_ScanCallback@DaveNottage好的,我在编辑中添加了它。Idk,如果它能帮上忙的话,因为它只是Java接口的自动生成桥接器。是的,我看到了,也觉得很奇怪。我更改了它,但在运行时仍然出现
EJNI错误
“找不到onScanComplete方法”
。我不明白为什么我不能将
jbarcode2withsoft\u ScanCallback
转换为
\u di\u jbarcode2withsoft\u ScanCallback
,尽管它实现了
jbarcode2withsoft\u ScanCallback
接口。如果我可以使用它,更改它的
onScanComplete()
方法并将其交给
setScan()
,那么我就不需要自己在Delphi中创建这样的类,因为它需要一个
\u di\u jbarcode2withsoft\u ScanCallback
。提供调用堆栈可能有助于将错误抛出
dispatchential()
在第651行的
Androidapi.JNIBridge.pas
中:
引发EJNIFatal.CreateResFmt(@SJNIMethodNotFound,'onScanComplete');“
在另一个线程中执行的Barcode2WithSoft类中,它由类似的行调用:
案例2:if(Barcode2WithSoft.this.scanCallback!=null){temp=new byte[1];Barcode2DWithSoft.this.scanCallback.onScanComplete(-1,msg.arg1,temp);}
因此我给它的
scanCallback
实例将不包含onScanComplete方法
方法确实收到一个
ScanCallback
实例
公共同步的void setScanCallback(final barcode2withsoft.ScanCallback sc){}
我指的是一个完整的调用堆栈,而不是最后一行。此外,案例2:的第二条最后一条注释中的代码似乎试图调用侦听器实现的方法,您不应该直接调用该方法;它应该由scanner实例调用。