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)


しかし、そうでなければ、削除関数がブール値を返すことに気付いたので、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の引数のレコードとその使用方法を使用していることがわかりました。これは非常に重要なポイントです。



All Articles