JNI e Delphi. Usando métodos Java com JNI

Bom Dia a todos!



Hoje vamos dar uma olhada em como usar métodos Java com JNI.

Na verdade, tudo é muito simples. Vamos começar imediatamente com um exemplo:



Digamos que temos um aplicativo Java no qual existe um botão simples e quando esse botão é pressionado, algum código será executado.

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        File MyFile = new File("D:\\Sample\\text.txt");
        MyFile.delete();
    }                        




Como podemos ver no evento de clique do botão, apenas o código para deletar o arquivo será executado.

Tudo parece claro e simples em Java, mas como ficará em Delphi usando JNI. Na verdade, tudo é mais fácil do que parece.

Para fazer isso, precisamos analisar e examinar a classe File, que está localizada no endereço java.io.File . Desta classe, precisamos:



- Obtenha a própria classe

- Obtenha a função de exclusão , ou seja, Nome e Descritor.

- Preencha o argumento para a função dada

- Use-o.



E então vamos começar.

O utilitário mais conveniente para desmontar uma classe em cheques, em minha opinião, é DirtyJOE. Vamos lá na classe File e procuramos nossa função nos métodos. Encontramos seu nome e descritor. Vá para Delphi e crie uma função lá.

function JVM_DeleteFile(JNIEnv: PJNIenv; FilePath: String): Boolean;


Observe em DirtyJOE que a função delete retorna um Booleano.

Tudo é simples aqui: o nome da função e declaramos as variáveis.

Vamos declarar variáveis ​​para nosso código funcionar:

var
  FileClass: JClass;
  Delete, Init: JMethodID;
  FileObj: JObject;
  Args: array[0..0] of JValue;


Isso é tudo o que procuraremos e usaremos posteriormente.

Agora vamos preencher os argumentos

Args[0].l:= WideToJString(jnienv, PwideChar(WideString(FilePath)));


Observe que passamos JString como JObject (na verdade, JString é JObject)

Bem, então receberemos a classe e o método delete:

FileClass:= jnienv^.FindClass(jnienv, 'java/io/File');
  Delete:= jnienv^.GetMethodID(jnienv, FileClass, 'delete', '()Z');


E agora não é uma fase pouco importante. Observe que no código Java criamos um novo objeto File e no Delphi precisamos fazer o mesmo:

Init:= jnienv^.GetMethodID(jnienv, FileClass, '<init>', '(Ljava/lang/String;)V');
  FileObj:= jnienv^.NewObjectA(jnienv, FileClass, Init, @Args);


E, essencialmente, só precisamos usar o próprio método delete:

jnienv^.CallBooleanMethod(jnienv, FileObj, Delete)


Mas, caso contrário notamos que a função delete retorna Boolean, então vamos verificar se ela retorna True ou False:

if jnienv^.CallBooleanMethod(jnienv, FileObj, Delete) = 1 then
  Result:= True
  else
  Result:= False;




Bem, vamos dar uma olhada nesta função pronta:

function JVM_DeleteFile(JNIEnv: PJNIenv; FilePath: String): Boolean;
var
  FileClass: JClass;
  Delete, Init: JMethodID;
  FileObj: JObject;
  Args: array[0..0] of JValue;
begin
  Args[0].l:= WideToJString(jnienv, PwideChar(WideString(FilePath)));
  FileClass:= jnienv^.FindClass(jnienv, 'java/io/File');
  Delete:= jnienv^.GetMethodID(jnienv, FileClass, 'delete', '()Z');
  Init:= jnienv^.GetMethodID(jnienv, FileClass, '<init>', '(Ljava/lang/String;)V');
  FileObj:= jnienv^.NewObjectA(jnienv, FileClass, Init, @Args);
  if jnienv^.CallBooleanMethod(jnienv, FileObj, Delete) = 1 then
  Result:= True
  else
  Result:= False;
end;




Conclusão.

Na verdade, tudo é mais fácil do que parece. Qualquer método Java pode ser usado com JNI. Neste exemplo, se você olhou de perto, viu que usei um registro de Argumentos do tipo JValue e como usá-los. Este é um ponto muito importante .



All Articles