سنلقي اليوم نظرة على كيفية استخدام طرق 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 وكيفية استخدامها. هذه نقطة مهمة جدا .