- JNI هو الواجهة المدمجة التي تسمح لتعليمات برمجية JVM باستدعاء دوال C أو C++ الأصلية، وتسمح لتعليمات برمجية أصلية باستدعاء Java مرة أخرى.
- الطريقة
nativeليس لها نص Java؛ يقوم JVM بربطها بوظيفة مُجمَّعة في وقت التشغيل. - تستخدم البرامج ذلك لإعادة استخدام المكتبات الأصلية، والوصول إلى نظام التشغيل، وتسريع المسارات الساخنة، أو التفاعل مع الأجهزة.
- الحدود واضحة: يمكن أن تتسبب الأعطال الأصلية في توقف JVM، وتكون عمليات البناء الأصلية خاصة بالنظام الأساسي.
واجهة البرمجة الأصلية (JNI) هي جزء لا يتجزأ من لغة جافا، تسمح للكود قيد التشغيل على جهاز Java الافتراضي (JVM) باستدعاء الدوال المكتوبة بلغة C أو C++، وتسمح أيضًا للكود الأصلي باستدعاء الدوال مرة أخرى إلى جافا. هذه هي الطريقة التي يصل بها برنامج جافا إلى خارج جهاز Java الافتراضي لاستخدام مكتبة نظام التشغيل أو جزء من الكود الآلي المترجم.
أين Opal يناسب
Opal هو تعديل Fabric، لذا فإن معظم مكوناته عبارة عن كود Java عادي، وتكتبه بلغة JavaScript بدلاً من التعامل مع الكود الأصلي. إذا كنت بدأت للتو، راجع دليل الإعداد
ما يفعله JNI
يربط JNI بين عالمين: كود Java المُدار على JVM وكود النظام الأصلي المُترجم إلى تعليمات الآلة. يتم تمييز طريقة Java بـ native ولا تحتوي على نص برمجي في Java. في وقت التشغيل، يقوم JVM بتحميل مكتبة نظام أصلي ويربط هذه الطريقة بوظيفة C أو C++ مطابقة. من هناك، تتبادل الجانبين الوسائط والقيم المرجعية ذهابًا وإيابًا.
يحصل الجانب الأصلي على مؤشر JNIEnv. هذا المعرّف هو البوابة: فهو يعرض وظائف لقراءة حقول Java واستدعاء طرق Java وإنشاء كائنات ورمي الاستثناءات. لذا، يعمل الجسر في كلا الاتجاهين، وليس فقط Java الذي يمتد.
لماذا يستخدم البرنامج ذلك
لا يحتاج معظم كود Java إلى JNI. يلجأ البرنامج إليه في بعض الحالات:
- إعادة استخدام كود النظام الأصلي الموجود. مكتبة C أو C++ ناضجة تقوم بالفعل بالمهمة وإعادة كتابتها في Java ليست مجدية.
- الوصول إلى نظام التشغيل. بعض ميزات النظام الأساسي ليس لها واجهة برمجة تطبيقات Java خالصة، لذا فإن استدعاء النظام الأصلي هو الطريقة الوحيدة.
- السرعة للمسار الساخن. يمكن أن تعمل روتين رقمي أو منخفض المستوى ضيق النطاق بشكل أسرع ككود أصلي مُترجم مقارنةً بـ JVM.
- لمس الأجهزة أو برامج التشغيل. غالبًا ما تكمن الرسومات والصوت والوصول إلى الجهاز خلف مكتبات النظام الأصلي.
كيف يعمل استدعاء JNI
الخطوات هي نفسها على كل منصة.
| الخطوة | ما يحدث |
|---|---|
| الإعلان | يتم كتابة طريقة Java باستخدام الكلمة المفتاحية native بدون نص برمجي. |
| الإنشاء | يتم تجميع دالة C أو C++ في مكتبة مشتركة (.dll، .so، .dylib). |
| التحميل | تستدعي Java الدالة System.loadLibrary لتحميل تلك المكتبة في وقت التشغيل. |
| الربط | يطابق جهاز Java الافتراضي (JVM) طريقة native مع الدالة C بالاسم. |
| الاستدعاء | تستدعي Java الطريقة؛ ينتقل التحكم إلى التعليمات البرمجية الأصلية ويعود مرة أخرى. |
تتبع أسماء الدوال نمطًا ثابتًا حتى يتمكن جهاز Java الافتراضي (JVM) من العثور عليها، وتخبرك ملف الرأس الذي تم إنشاؤه بالتوقيع الدقيق الذي يجب تنفيذه.
التكاليف والمخاطر
JNI قوي ولكنه يحتوي على حواف حادة. يمكن أن يؤدي الانهيار في التعليمات البرمجية الأصلية إلى إسقاط جهاز Java الافتراضي (JVM) بأكمله، لأن هذا الرمز يعمل خارج شبكة الأمان الخاصة بجهاز Java الافتراضي (JVM). الذاكرة التي يتم تخصيصها من الجانب الأصلي لا يتم جمعها بواسطة جامع القمامة، لذا فإن التسريبات سهلة. كل عبور بين Java والأصلي له تكلفة إضافية، لذا فإن الاستدعاء عبر الحدود في حلقة ضيقة يمكن أن يكون بطيئًا. ومكتبات JNI خاصة بالنظام الأساسي: لن يعمل البناء الخاص بنظام Windows على Linux بدون تجميع منفصل.
استخدمه باعتدال
بما أن الحدود الأصلية تتجاوز ضمانات الأمان في JVM، فإن JNI هو نوع الأداة التي تستخدمها فقط عندما لا يكون هناك مسار Java خالص. معظم التعديلات، بما في ذلك Opal، لا تحتاج إليه أبدًا
الأسئلة الشائعة
نعم. يأتي JNI مع JDK و JVM. لا تحتاج إلى تثبيت أي شيء إضافي على جانب Java، على الرغم من أنك تحتاج إلى مجموعة أدوات أصلية لتجميع الجزء المكتوب بلغة C أو C++
لا. يظل الجانب الخاص بجافا قابلاً للنقل، ولكن المكتبة الأصلية تُترجم لنظام تشغيل ومعالج واحد، لذا تقوم بتوزيع إصدار أصلي منفصل لكل منصة
لا. هذه هي الطريقة الأصلية المدمجة. تضيف إصدارات Java الأحدث واجهة برمجة تطبيقات (API) أجنبية أكثر حداثة تهدف إلى أن تكون أكثر أمانًا وسهولة، لكن JNI لا تزال مستخدمة على نطاق واسع ومفهومة جيدًا
قد يحتاج العميل المكتوب بشكل أساسي بلغة جافا أحيانًا إلى مكتبة أصلية لشيء لا تستطيع آلة جافا الافتراضية (JVM) القيام به مباشرةً. JNI هو الجسر القياسي لتحميل واستدعاء تلك المكتبة