1

我一直在做这件事好几天没有任何运气。这就是java2pas提供BeaconManager$ServiceReadyCallback

  [JavaSignature('com/estimote/sdk/BeaconManager$ServiceReadyCallback')]
  JBeaconManager_ServiceReadyCallback = interface(JObject)
    ['{335D3A89-7137-44CE-9969-BECC2F3AB8AC}']
    procedure onServiceReady ; cdecl;                                           // ()V A: $401
  end;

从那我做了匿名方法如下:

TAnServiceReadyCallBack = reference to function : JBeaconManager_ServiceReadyCallback;

下面我怎么称呼它:

var
  an : TAnServiceReadyCallBack;
  bm : JBeaconManager;
begin
bm := TJBeaconManager.JavaClass.init(SharedActivityContext);
an := function : JBeaconManager_ServiceReadyCallback
      begin
         Result := TJBeaconManager_ServiceReadyCallback.Wrap((context as ILocalObject).GetObjectID);
      if Assigned(Result) then
         Memo1.Lines.Add('servicereadycallback init')
      else
        Memo1.Lines.Add('servicereadycallback not init')
end;
bm.connect(an); 

在那个 bm.connect(an) 电话我收到如下:

java.lang.ClassCastException: com.embarcadero.firemonkey.FMXNativeActivity cannot be cast to com.estimote.sdk.BeaconManager$ServiceReadyCallback

根据 estimote sdk,这就是:

   beaconManager.connect(new BeaconManager.ServiceReadyCallback() {
     @Override public void onServiceReady() {
       try {
         beaconManager.startRanging(ALL_ESTIMOTE_BEACONS);
       } catch (RemoteException e) {
         Log.e(TAG, "Cannot start ranging", e);
       }
     }
   });

连接方法代码beacon sdk如下:

  public void connect(ServiceReadyCallback callback)
  {
    if (!checkPermissionsAndService()) {
      L.e("AndroidManifest.xml does not contain android.permission.BLUETOOTH or android.permission.BLUETOOTH_ADMIN permissions. BeaconService may be also not declared in AndroidManifest.xml.");
    }
    this.callback = ((ServiceReadyCallback)Preconditions.checkNotNull(callback, "callback cannot be null"));
    if (isConnectedToService()) {
      callback.onServiceReady();
    }
    boolean bound = this.context.bindService(new Intent(this.context, BeaconService.class), this.serviceConnection, 1);
    if (!bound) {
      L.w("Could not bind service: make sure thatcom.estimote.sdk.service.BeaconService is declared in AndroidManifest.xml");
    }
  }

我还尝试制作delphi如下课程:

  TServiceReadyCallback = class(TJavaLocal,
    JBeaconManager_ServiceReadyCallback)
  private
    fParent: TForm4;
  public
    constructor Create(parent: TForm4; context: JContext);
    function equals(o: JObject): boolean; cdecl;
    function getClass: Jlang_Class; cdecl;
    function hashCode: Integer; cdecl;
    procedure notify; cdecl;
    procedure notifyAll; cdecl;
    function toString: JString; cdecl;
    procedure wait; overload; cdecl;
    procedure wait(millis: Int64); overload; cdecl;
    procedure wait(millis: Int64; nanos: Integer); overload; cdecl;
    procedure onServiceReady; cdecl;
  end;

constructor TServiceReadyCallback.Create(parent: TForm4;
context: JContext);
begin
  fParent := parent;
  fParent.Memo1.Lines.Add('ServiceReadyCallback Created');
end;

使用这个类,我使用如下:

var
  fservice: TServiceReadyCallback;
  context: JContext; 
  bm : JBeaconManager; 
begin
  CallInUIThreadAndWaitFinishing(
  procedure
  begin
  context := SharedActivityContext;
  bm := TJBeaconManager.JavaClass.init(context); 
  fservice := TServiceReadyCallback.Create(Self, context);
  bm.connect(fservice);
  end);
end;

在使用这个我收到callback cannot be null' from beaconmanager.java线

this.callback = ((ServiceReadyCallback)Preconditions.checkNotNull(callback, "callback cannot be null"));

我非常需要这个,因为我的客户正在向我施压。我已经研究了至少 3-4 个月,但没有任何运气。有没有人可以帮我解决这个问题?

4

1 回答 1

1

您还没有提供 JNI Bridge 包装器的完整定义,应该如下所示:

  JBeaconManager_ServiceReadyCallbackClass = interface(JObjectClass)
    ['{D1DC624A-9431-4724-A0B6-2FE039BDCC33}']
    procedure onServiceReady ; cdecl;
  end;

  [JavaSignature('com/estimote/sdk/BeaconManager_ServiceReadyCallback')]
  JBeaconManager_ServiceReadyCallback = interface(JObject)
    ['{40394705-FCFB-442E-B3C7-3EA9825CDDBF}']
    procedure onServiceReady ; cdecl;
  end;

  TJBeaconManager_ServiceReadyCallback = class(TJavaGenericImport<JBeaconManager_ServiceReadyCallbackClass, JBeaconManager_ServiceReadyCallback>)
  end;
于 2014-08-15T16:26:06.973 回答