JNI dan Delphi. Menggunakan Metode Java dengan JNI

Selamat siang untuk semuanya!



Hari ini kita akan melihat bagaimana menggunakan metode Java dengan JNI.

Padahal, semuanya sangat sederhana. Mari kita mulai segera dengan sebuah contoh:



Misalkan kita memiliki aplikasi Java yang di dalamnya terdapat tombol sederhana dan ketika tombol ini ditekan, beberapa kode akan dijalankan.

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        File MyFile = new File("D:\\Sample\\text.txt");
        MyFile.delete();
    }                        




Seperti yang bisa kita lihat pada event klik tombol, hanya kode untuk menghapus file yang akan dijalankan.

Semuanya terlihat jelas dan sederhana di Java, tetapi bagaimana tampilannya di Delphi menggunakan JNI. Faktanya, semuanya lebih mudah dari yang terlihat.

Untuk melakukan ini, kita perlu mengurai dan melihat ke dalam kelas File, yang terletak di alamat java.io.File . Dari kelas ini, kita membutuhkan:



- Dapatkan kelasnya sendiri

- Dapatkan fungsi delete yaitu Name dan Descriptor.

- Isi argumen untuk fungsi yang diberikan

- Gunakan.



Jadi mari kita mulai.

Utilitas paling nyaman untuk membongkar kelas menjadi cek, menurut saya, adalah DirtyJOE. Kami pergi ke sana kelas File dan mencari fungsi kami di metode. Kami menemukan Nama dan Deskriptornya. Pergi ke Delphi dan buat fungsi seperti itu di sana.

function JVM_DeleteFile(JNIEnv: PJNIenv; FilePath: String): Boolean;


Perhatikan di DirtyJOE bahwa fungsi delete mengembalikan Boolean.

Semuanya sederhana di sini: Nama fungsi dan kami mendeklarasikan variabel.

Mari deklarasikan variabel agar kode kita berfungsi:

var
  FileClass: JClass;
  Delete, Init: JMethodID;
  FileObj: JObject;
  Args: array[0..0] of JValue;


Ini semua yang akan kita cari dan gunakan lebih lanjut.

Sekarang mari isi Argumen

Args[0].l:= WideToJString(jnienv, PwideChar(WideString(FilePath)));


Harap dicatat bahwa kami melewatkan JString sebagai JObject (Sebenarnya, JString adalah JObject)

Nah, kemudian kami akan menerima kelas dan metode hapus:

FileClass:= jnienv^.FindClass(jnienv, 'java/io/File');
  Delete:= jnienv^.GetMethodID(jnienv, FileClass, 'delete', '()Z');


Dan sekarang bukan tahapan yang penting. Harap dicatat bahwa dalam kode Java kami membuat objek File baru dan di Delphi kami perlu melakukan hal yang sama:

Init:= jnienv^.GetMethodID(jnienv, FileClass, '<init>', '(Ljava/lang/String;)V');
  FileObj:= jnienv^.NewObjectA(jnienv, FileClass, Init, @Args);


Dan pada dasarnya kita hanya perlu menggunakan metode hapus itu sendiri:

jnienv^.CallBooleanMethod(jnienv, FileObj, Delete)


Tapi, karena jika tidak kita perhatikan bahwa fungsi delete mengembalikan Boolean, maka mari kita periksa apakah itu mengembalikan True atau False:

if jnienv^.CallBooleanMethod(jnienv, FileObj, Delete) = 1 then
  Result:= True
  else
  Result:= False;




Nah, mari kita lihat fungsi yang sudah jadi ini:

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;




Kesimpulan.

Faktanya, semuanya lebih mudah dari yang terlihat. Metode Java apa pun dapat digunakan dengan JNI. Dalam contoh ini, jika Anda melihat lebih dekat, Anda melihat bahwa saya menggunakan catatan Argumen tipe JValue dan cara menggunakannya. Ini adalah poin yang sangat penting .



All Articles