GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Como utilizar a interface do arquivo JNI que foi gerado pelo java2op?

Tags: #<Tag:0x00007f3bd8386678> #<Tag:0x00007f3bd83862b8> #<Tag:0x00007f3bd8385ed0> #<Tag:0x00007f3bd83859d0>

Para utlizar o sdk do fabricante no meu projeto android utilizando o delphi, eu gerei o .jar e adicionei no libs do meu projeto e depois gerei o JNI usando o java2op. As funções que não precisa implementar o Callback esta funcionando que mostra que o delphi esta se comunicando com o java.

A dificuldade esta em implementar o Callback de impressão: Trecho JNI gerado pelo java2op:

JIPrinterCallbackClass = interface(JIInterfaceClass)
   ['{ABEF5590-D20B-43A1-A35B-807051A7330D}']
end;

[JavaSignature('com/getnet/posdigital/printer/IPrinterCallback')]
JIPrinterCallback = interface(JIInterface)
   ['{08B39C40-A389-4ED5-9E6B-DA7D6A8C7600}']
   procedure onError(P1: Integer); cdecl;
   procedure onSuccess; cdecl;
end;
TJIPrinterCallback = class(TJavaGenericImport<JIPrinterCallbackClass, JIPrinterCallback>) end;

JIPrinterCallback_StubClass = interface(JBinderClass)
   ['{758A2E1B-E31A-4221-BAC7-8092F224090A}']
   {class} function asInterface(P1: JIBinder): JIPrinterCallback; cdecl;
   {class} function init: JIPrinterCallback_Stub; cdecl;
end;

[JavaSignature('com/getnet/posdigital/printer/IPrinterCallback$Stub')]
JIPrinterCallback_Stub = interface(JBinder)
   ['{CF6E873A-2FA2-4C71-A2FA-66B27EDA1A72}']
   function asBinder: JIBinder; cdecl;
   function onTransact(P1: Integer; P2: JParcel; P3: JParcel; P4: Integer): Boolean; cdecl;
end;
TJIPrinterCallback_Stub = class(TJavaGenericImport<JIPrinterCallback_StubClass, 
JIPrinterCallback_Stub>) end;

JIPrinterCallback_Stub_ProxyClass = interface(JIPrinterCallbackClass)
  ['{D013AB01-DBD9-4CC3-AC42-CB036F080131}']
end;

[JavaSignature('com/getnet/posdigital/printer/IPrinterCallback$Stub$Proxy')]
JIPrinterCallback_Stub_Proxy = interface(JIPrinterCallback)
   ['{5FB7E803-D568-43F9-8F42-634E96FC5279}']
   function asBinder: JIBinder; cdecl;
   function getInterfaceDescriptor: JString; cdecl;
   procedure onError(P1: Integer); cdecl;
   procedure onSuccess; cdecl;
end;
TJIPrinterCallback_Stub_Proxy = class(TJavaGenericImport<JIPrinterCallback_Stub_ProxyClass, 
JIPrinterCallback_Stub_Proxy>) end;

Tenho que reproduzir o codigo abaixo que esta em java em delphi:

public class MbPrinterCallback extends IPrinterCallback.Stub {
  @Override
  public void onSuccess() throws RemoteException {

  }

  @Override
  public void onError(int i) throws RemoteException {

  }

}

Como ficaria em delphi o codigo citado?

Desde já agradeço.

Tem certeza que isso é JNI?
Cadê sua classe com métodos native?

Será que não é mais fácil você fazer sua DLL em Delphi e daí fazer o Java acessá-la com JNA?

JNA é bem menos trabalhoso que JNI.

Sim. No android studio eu crei um projeto para importar o sdk, após ter feito isso eu gerei o apk. Depois eu descompactei o apk , peguei o arquivo .dex que contem o sdk do fabricante e o converti para um jar. Com o jar em mãos, adicionei o no meu projeto feito em delphi e gerei o gerei o JNI usando o java2op.
Tem funções da sdk que não tem um callback como por exemplo uma delas é o bip, fiz a chamada dessa função e funcionou normal que tudo indica que teve uma comunicação do delphi com java.
A minha dificuldade é reproduzir uma classe que extends IPrinterCallback.Stub, pois preciso passar ela para uma função.
Se fosse fazer no android studio seria assim essa classe:

 public class MbPrinterCallback extends IPrinterCallback.Stub {
  @Override
  public void onSuccess() throws RemoteException {

  }

  @Override
  public void onError(int i) throws RemoteException {

  }
}

Queria reproduzir essa classe em delphi. Como seria?

//