今天,我们将看一下如何在JNI中使用Java方法。
实际上,一切都很简单。让我们从一个示例开始:
假设我们有一个Java应用程序,上面有一个简单的按钮,当按下此按钮时,将执行一些代码。
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
File MyFile = new File("D:\\Sample\\text.txt");
MyFile.delete();
}
如我们所见,在按钮单击事件中,将仅执行删除文件的代码。
在Java中,一切看起来都很简单明了,但是在使用JNI的Delphi中会看起来如何。实际上,一切都比看起来容易。
为此,我们需要解析并查看位于java.io.File的File类。在这个课程中,我们需要:
-获取类本身
-获取删除函数,即Name和Descriptor。
-填写给定函数的参数
-使用它。
因此,让我们开始吧。
在我看来,将类分解成检查形式最方便的工具是DirtyJOE。我们去File类,然后在方法中寻找我们的功能。我们找到她的名字和描述符。转到Delphi并在那里创建这样的功能。
function JVM_DeleteFile(JNIEnv: PJNIenv; FilePath: String): Boolean;
请注意,在DirtyJOE中,删除函数返回一个布尔值。
这里的一切都很简单:函数的名称,我们声明变量。
让我们声明变量以使我们的代码起作用:
var
FileClass: JClass;
Delete, Init: JMethodID;
FileObj: JObject;
Args: array[0..0] of JValue;
这就是我们将寻找并进一步使用的所有内容。
现在让我们填写参数
Args[0].l:= WideToJString(jnienv, PwideChar(WideString(FilePath)));
请注意,我们将JString作为JObject传递(实际上,JString是JObject),
那么,我们将收到该类和delete方法:
FileClass:= jnienv^.FindClass(jnienv, 'java/io/File');
Delete:= jnienv^.GetMethodID(jnienv, FileClass, 'delete', '()Z');
现在不是一个重要的阶段。请注意,在Java代码中,我们创建了一个新的File对象,在Delphi中,我们需要这样做:
Init:= jnienv^.GetMethodID(jnienv, FileClass, '<init>', '(Ljava/lang/String;)V');
FileObj:= jnienv^.NewObjectA(jnienv, FileClass, Init, @Args);
而且我们基本上只需要使用delete方法本身即可:
jnienv^.CallBooleanMethod(jnienv, FileObj, Delete)
但是,由于否则我们注意到delete函数返回布尔值,因此让我们检查它是否返回True或False:
if jnienv^.CallBooleanMethod(jnienv, FileObj, Delete) = 1 then
Result:= True
else
Result:= False;
好,让我们看一下现成的函数:
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;
结论。
实际上,一切都比看起来容易。JNI可以使用任何Java方法。在此示例中,如果仔细观察,您会发现我使用了JValue类型的Arguments以及如何使用它们的记录。这是很重要的一点。