JNI和Delphi。通过JNI使用Java方法

祝大家有美好的一天!



今天,我们将看一下如何在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以及如何使用它们的记录。这是很重要的一点



All Articles