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 .