今日は、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の引数のレコードとその使用方法を使用していることがわかりました。これは非常に重要なポイントです。