ما هو JNI؟ شرح واجهة Java الأصلية

واجهة الجافا الأصلية (JNI) هي الجسر الذي يسمح لتعليمات برمجية جافا باستدعاء دوال C أو C++ الأصلية، ويسمح أيضًا للتعليمات البرمجية الأصلية باستدعاء الدوال مرة أخرى إلى جهاز الجافا الافتراضي (JVM).

Conceptsby trqUpdated June 4, 2026
Key takeaways
  • 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، لا تحتاج إليه أبدًا

الأسئلة الشائعة