JNI ودلفي. استخدام طرق Java مع JNI

يوم جيد للجميع!



سنلقي اليوم نظرة على كيفية استخدام طرق Java مع JNI.

في الواقع ، كل شيء بسيط للغاية. لنبدأ على الفور بمثال:



لنفترض أن لدينا تطبيق Java به زر بسيط ، وعندما يتم الضغط على هذا الزر ، سيتم تنفيذ بعض التعليمات البرمجية.

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




كما نرى في حدث النقر على الزر ، سيتم تنفيذ رمز حذف الملف فقط.

كل شيء يبدو واضحًا وبسيطًا في Java ، ولكن كيف سيبدو في دلفي باستخدام JNI. في الواقع ، كل شيء أسهل مما يبدو.

للقيام بذلك ، نحتاج إلى التحليل والبحث في فئة الملف الموجودة في java.io.File . من هذا الفصل نحتاج:



- احصل على الفصل نفسه

- احصل على وظيفة الحذف ، وهي الاسم والواصف.

- املأ الوسيطة لهذه الوظيفة

- استخدمها.



ولذا فلنبدأ.

الأداة الأكثر ملاءمة لتفكيك فئة إلى شيكات ، في رأيي ، هي DirtyJOE. نذهب إلى هناك في فئة File ونبحث عن وظيفتنا في الطرق. نجد لها الاسم والواصف. اذهب إلى دلفي وأنشئ مثل هذه الوظيفة هناك.

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)

حسنًا ، ثم سنحصل على class وطريقة الحذف:

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


والآن ليست مرحلة مهمة قليلاً. يرجى ملاحظة أننا في كود Java نقوم بإنشاء كائن ملف جديد وفي دلفي نحتاج إلى القيام بنفس الشيء:

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


ونحن في الأساس نحتاج فقط إلى استخدام طريقة الحذف نفسها:

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;




خاتمة.

في الواقع ، كل شيء أسهل مما يبدو. يمكن استخدام أي طريقة Java مع JNI. في هذا المثال ، إذا نظرت عن كثب ، رأيت أنني استخدمت سجلاً للوسيطات من النوع JValue وكيفية استخدامها. هذه نقطة مهمة جدا .



All Articles