Heute werden wir uns ansehen, wie Java-Methoden mit JNI verwendet werden.
In der Tat ist alles sehr einfach. Beginnen wir gleich mit einem Beispiel:
Nehmen wir an, wir haben eine Java-Anwendung, für die es eine einfache Schaltfläche gibt, und wenn diese Schaltfläche gedrückt wird, wird Code ausgeführt.
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
File MyFile = new File("D:\\Sample\\text.txt");
MyFile.delete();
}
Wie wir sehen können, wird im Button-Click-Ereignis nur der Code zum Löschen der Datei ausgeführt.
In Java sieht alles klar und einfach aus, aber wie wird es in Delphi mit JNI aussehen? In der Tat ist alles einfacher als es scheint.
Dazu müssen wir die File-Klasse analysieren und untersuchen, die sich unter java.io.File befindet . Aus dieser Klasse brauchen wir:
- Holen Sie sich die Klasse selbst
- Holen Sie sich die Löschfunktion , nämlich Name und Deskriptor.
- Geben Sie das Argument für die angegebene Funktion ein.
- Verwenden Sie es.
Und so fangen wir an.
Meiner Meinung nach ist DirtyJOE das bequemste Dienstprogramm, um eine Klasse in Schecks zu zerlegen. Wir gehen dorthin in die File-Klasse und suchen in den Methoden nach unserer Funktion. Wir finden ihren Namen und Deskriptor. Gehen Sie zu Delphi und erstellen Sie dort eine solche Funktion.
function JVM_DeleteFile(JNIEnv: PJNIenv; FilePath: String): Boolean;
Beachten Sie in DirtyJOE, dass die Löschfunktion einen Booleschen Wert zurückgibt.
Hier ist alles einfach: Der Name der Funktion und wir deklarieren die Variablen.
Lassen Sie uns Variablen deklarieren, damit unser Code funktioniert:
var
FileClass: JClass;
Delete, Init: JMethodID;
FileObj: JObject;
Args: array[0..0] of JValue;
Dies ist alles, was wir suchen und weiter nutzen werden.
Füllen wir nun die Argumente aus
Args[0].l:= WideToJString(jnienv, PwideChar(WideString(FilePath)));
Bitte beachten Sie, dass wir JString als JObject übergeben (JString ist tatsächlich JObject)
. Dann erhalten wir die Klasse und die Löschmethode :
FileClass:= jnienv^.FindClass(jnienv, 'java/io/File');
Delete:= jnienv^.GetMethodID(jnienv, FileClass, 'delete', '()Z');
Und jetzt ist keine kleine wichtige Etappe. Bitte beachten Sie, dass wir in Java-Code ein neues Dateiobjekt erstellen und in Delphi dasselbe tun müssen:
Init:= jnienv^.GetMethodID(jnienv, FileClass, '<init>', '(Ljava/lang/String;)V');
FileObj:= jnienv^.NewObjectA(jnienv, FileClass, Init, @Args);
Und wir müssen im Wesentlichen nur die Löschmethode selbst verwenden:
jnienv^.CallBooleanMethod(jnienv, FileObj, Delete)
Da wir jedoch festgestellt haben, dass die Löschfunktion Boolean zurückgibt, prüfen wir, ob True oder False zurückgegeben wird:
if jnienv^.CallBooleanMethod(jnienv, FileObj, Delete) = 1 then
Result:= True
else
Result:= False;
Schauen wir uns diese fertige Funktion an:
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;
Fazit.
In der Tat ist alles einfacher als es scheint. Jede Java-Methode kann mit JNI verwendet werden. In diesem Beispiel haben Sie bei genauem Hinsehen festgestellt , dass ich einen Datensatz mit Argumenten vom Typ JValue verwendet habe und wie diese verwendet werden. Dies ist ein sehr wichtiger Punkt .