JNI y Delphi. Uso de métodos Java con JNI

¡Buen día a todos!



Hoy vamos a ver cómo usar métodos Java con JNI.

De hecho, todo es muy sencillo. Comencemos de inmediato con un ejemplo:



digamos que tenemos una aplicación Java en la que hay un botón simple y cuando se presiona este botón, se ejecutará algún código.

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




Como podemos ver, en el evento de clic de botón, solo se ejecutará el código para eliminar el archivo.

Todo parece claro y simple en Java, pero ¿cómo se verá en Delphi usando JNI? De hecho, todo es más fácil de lo que parece.

Para hacer esto, necesitamos analizar y buscar en la clase File, que se encuentra en java.io.File . De esta clase, necesitamos:



- Obtener la clase en sí

- Obtener la función de eliminación , a saber, Nombre y Descriptor.

- Complete el argumento de esta función

- Úselo.



Así que comencemos.

La utilidad más conveniente para desmontar una clase en cheques, en mi opinión, es DirtyJOE. Vamos a la clase File y buscamos nuestra función en los métodos. Encontramos su nombre y descriptor. Vaya a Delphi y cree esa función allí.

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


Tenga en cuenta en DirtyJOE que la función de eliminación devuelve un booleano.

Aquí todo es simple: El nombre de la función y declaramos las variables.

Declaremos variables para que nuestro código funcione:

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


Esto es todo lo que buscaremos y usaremos más.

Ahora completemos los argumentos

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


Tenga en cuenta que pasamos JString como JObject (de hecho, JString es JObject)

Bueno, entonces recibiremos la clase y el método de eliminación:

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


Y ahora no es una etapa poco importante. Tenga en cuenta que en el código Java creamos un nuevo objeto File y en Delphi tenemos que hacer lo mismo:

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


Y esencialmente solo necesitamos usar el método de eliminación en sí:

jnienv^.CallBooleanMethod(jnienv, FileObj, Delete)


Pero, dado que de lo contrario notamos que la función de eliminación devuelve Boolean, entonces verifiquemos si devuelve Verdadero o Falso:

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




Bueno, echemos un vistazo a esta función lista para usar:

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;




Conclusión.

De hecho, todo es más fácil de lo que parece. Se puede utilizar cualquier método Java con JNI. En este ejemplo, si miró de cerca, vio que usé un registro de argumentos de tipo JValue y cómo usarlos. Este es un punto muy importante .



All Articles