JNI et Delphi. Utilisation des méthodes Java avec JNI

Bonne journée à tous!



Aujourd'hui, nous allons voir comment utiliser les méthodes Java avec JNI.

En fait, tout est très simple. Commençons tout de suite par un exemple:



disons que nous avons une application Java sur laquelle il y a un simple bouton et lorsque ce bouton est enfoncé, du code sera exécuté.

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




Comme nous pouvons le voir dans l'événement de clic sur le bouton, seul le code pour supprimer le fichier sera exécuté.

Tout semble clair et simple en Java, mais à quoi cela ressemblera-t-il dans Delphi en utilisant JNI. En fait, tout est plus facile qu'il n'y paraît.

Pour ce faire, nous devons analyser et examiner la classe File, qui se trouve dans java.io.File . De cette classe, nous avons besoin de:



- Obtenez la classe elle

- même - Obtenez la fonction de suppression , à savoir le nom et le descripteur.

- Remplissez l'argument de la fonction donnée

- Utilisez-le.



Et alors commençons.

L'utilitaire le plus pratique pour désassembler une classe en chèques, à mon avis, est DirtyJOE. On y va dans la classe File et on cherche notre fonction dans les méthodes. Nous trouvons son nom et son descripteur. Allez dans Delphi et créez-y une telle fonction.

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


Notez dans DirtyJOE que la fonction de suppression renvoie un booléen.

Tout est simple ici: Le nom de la fonction et nous déclarons les variables.

Déclarons des variables pour que notre code fonctionne:

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


C'est tout ce que nous rechercherons et utiliserons plus loin.

Maintenant, remplissons les arguments

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


Veuillez noter que nous passons JString comme JObject (en fait, JString est JObject)

Eh bien, nous recevrons la classe et la méthode de suppression:

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


Et maintenant, ce n'est pas une étape peu importante. Notez que dans le code Java, nous créons un nouvel objet File et dans Delphi, nous devons faire de même:

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


Et nous n'avons essentiellement besoin que d'utiliser la méthode de suppression elle-même:

jnienv^.CallBooleanMethod(jnienv, FileObj, Delete)


Mais, sinon nous avons remarqué que la fonction de suppression retourne Boolean, vérifions alors si elle renvoie True ou False:

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




Eh bien, jetons un coup d'œil à cette fonction prête à l'emploi:

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;




Conclusion.

En fait, tout est plus facile qu'il n'y paraît. Toute méthode Java peut être utilisée avec JNI. Dans cet exemple, si vous avez regardé de près, vous avez vu que j'ai utilisé un enregistrement d'Arguments de type JValue et comment les utiliser. C'est un point très important .



All Articles