منذ بعض الوقت ، استخدمت Java لتطوير مثبت لبيئة الويب التي صممها Tomcat MySQL. أثناء عملية التطوير ، واجهت مشاكل مثل كتابة سجلات النظام وتسجيلها ، وما إلى ذلك ، والتي كان من الصعب حلها باستخدام Java نفسها ، لذلك فكرت في استخدام JNI. C و Delphi تطوير JNI.
لتطوير JNI مع Delphi ، قم أولاً بتنزيل jni.pas من http://delphi-jedi.org ، وأضفه إلى المشروع ويمكنك تطوير JNI.
على سبيل المثال ، قم بإنشاء اختصار لسطح المكتب:
رمز في دلفي:
مكتبة mydll
يستخدم
JNI ، Windows ، Comobj ، ActiveX ، shlobj ، sysutils ، registry ؛
// احصل على دليل سطح المكتب
وظيفة getDesktopPath (): سلسلة ؛
var
ريج: Tregistry ؛
DesktOppath: سلسلة ؛
يبدأ
ريج: = tregistry.create ؛
يحاول
Reg.Rootkey: = hkey_current_user ؛
reg.openkey ('software/microsoft/windows/currentversion/explorer/shell مجلدات ، false) ؛
إذا كان reg.valuexists ('desktop') ثم desktoppath: = reg.ReadString ('desktop') ؛
النتيجة: = DesktOppath ؛
أخيراً
ريج.
نهاية؛
نهاية؛
// إنشاء اختصارات سطح المكتب
الإجراء الذي تم إنشاؤه ktoplink (Programpath ، programArg ، LinkName ، descr ، iconpath: string) ؛
var
Anobj: iunknown ؛
الصوفاء: Ishelllink ؛
Afile: ipersistfile ؛
اسم الملف: WideString ؛
LinkPath: String ؛
يبدأ
LinkPath: = getDeskTopPath ()+'/'+linkName ؛
إذا كانت الكبح القاسي (extractFileStex (LinkPath)) <> '.
يبدأ
رفع استثناء. إنشاء ('تمديد الاختصار يجب أن يكون .lnk!') ؛
نهاية؛
يحاول
Oleinitialize (NIL) ؛ // تهيئة مكتبة OLE ، يجب استدعاء التهيئة قبل استخدام وظيفة OLE.
anobj: = createComObject (CLSID_SHELLLINK) ؛ // إنشاء كائن com يعتمد على classid المحدد ، إليك الاختصار
shelllink: = anobj كما ishelllink ؛ // capt إلى واجهة الاختصار
Afile: = anobj كـ ipersistfile ؛ // التحويل الأسير إلى واجهة ملف
// تعيين خصائص الاختصار ، فقط عدد قليل من الخصائص شائعة الاستخدام هنا
shelllink.setpath (pchar (programpath)) ؛
shelllink.setarguments (PCHAR (programARG)) ؛ // معلمات الملف الهدف
shelllink.setworkingdirectory (PCHAR (extractfilepath (Programpath))) ؛ // دليل العمل للملف الهدف
shelllink.setdescription (PCHAR (DESCR)) ؛ // وصف الملف الهدف
Shelllink.SeticOnlocation (PCHAR (ICONPATH) ، 0) ؛
اسم الملف: = LinkPath ؛ // تحويل اسم الملف إلى نوع التسليم
Afile.save (Pwchar (filename) ، false) ؛ // save اختصار
أخيراً
Oleuninitialize ؛ // أغلق مكتبة OLE ، يجب استدعاء هذه الوظيفة في أزواج مع Oleinitialize
نهاية؛
نهاية؛
// إنشاء اختصار لسطح المكتب ، يتم استدعاء هذه الطريقة في JNI
// تسمية هذه العملية خاصة جدًا. لا يمكن أن تكون طريقة التسمية هذه غير صحيحة ، وإلا فإن فئة Java لن تكون قادرة على التوافق مع طريقة Nativ معها. في الوقت نفسه ، على منصات Win32 ، لا يمكن الإعلان عن طريقة استدعاء هذه العملية إلا على أنها stdcall.
الإجراء java_com_wpd_javawindows_createdesktoplink (penv: pjnienv ؛ obj: Jobjous ؛ programpath ، programarg ، linkname ، descr ، iconpath: jstring) ؛ stdcall ؛
var
JVM: tjnienv ؛
PPATH: سلسلة.
PARG: سلسلة.
lname: سلسلة ؛
الوصف: سلسلة ؛
Ipath: سلسلة ؛
يبدأ
JVM: = tjnienv.create (penv) ؛
PPATH: = jvM.UnicodeJStringToString (Programpath) ؛
parg: = jvM.UnicodeJStringTsTring (programArg) ؛
lname: = jvM.UnicodeJStringToString (LinkName) ؛
الوصف: = jvM.UnicodeJStringToString (descr) ؛
ipath: = jvM.UnicodeJstringToString (IconPath) ؛
CreateSkTopLink (PPATH ، PARG ، LNAME ، الوصف ، ipath) ؛
JVM.Free ؛
نهاية؛
// أرسل رسالة إلى Java
الدالة java_com_wpd_javawindows_sendmessage (penv: pjnienv ؛ obj: Jobject): Jobject ؛ stdcall ؛
var
JVM: tjnienv ؛
MSG: Jobject ؛
م: سلسلة.
يبدأ
JVM: = tjnienv.create (penv) ؛
// ************** إذا كانت الرسالة المرسلة تحتوي على أحرف صينية ، فيجب أن يتم ترميزها أولاً من خلال UTF8Encode ، وإلا فسيتم تشويهها عند الحصول عليها في Java
M: = utf8encode ('الصينية') ؛
msg: = jvM.StringTojString (pchar (m)) ؛
النتيجة: = msg ؛
نهاية؛
{$ r *.res}
صادرات
java_com_wpd_javawindows_createdesktoplink ،
java_com_wpd_javawindows_sendmessage ؛
نهاية.
ضع المجموعة أعلاه لإنشاء ملف mydll.dll ووضعه حيث يمكن لـ Java العثور عليه.
رمز في جافا:
حزمة com.wpd ؛
الطبقة العامة javawindows {
public native void createSktopLink (String Programpath ، String ProgramArg ، String LinkPath ، وصف السلسلة ، iconpath السلسلة) ؛
السلسلة الأصلية العامة sendMessage () ؛
ثابت {
System.LoadLibrary ("mydll") ؛
}
الفراغ الثابت العام الرئيسي (سلسلة S []) {
New Javawindows (). createdesktoplink ("C: /Text.exe" ، "" ، "test.lnk" ، "" ، "c: /test.ico") ؛
System.out.println (New Javawindows (). SendMessage ()) ؛
}
}