لماذا FFM بدلًا من JNI
تفاعل أكثر أمانًا مع الشيفرة الأصلية
لماذا FFM بدلًا من JNI درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
استدعاء الشفرة الأصلية
تحتاج Java أحيانًا إلى استدعاء مكتبات C أو التعامل مع الذاكرة خارج الكومة. كانت الطريقة التقليدية هي Java Native Interface (JNI). أما الطريقة الحديثة فهي Foreign Function and Memory API (FFM)، التي اكتمل اعتمادها في Java 22 (JEP 454).
يشرح هذا الدرس سبب كون FFM خيارًا أفضل.
ما تطلبه JNI
كانت JNI شاقة:
- كتابة شفرة ربط بلغة C باستخدام تواقيع
JNIEXPORTغير المريحة - ترجمة مكتبة أصلية مشتركة لكل منصة
- التحويل يدويًا بين أنواع Java وC
- كان من السهل التسبب في انهيار JVM بسبب خطأ
FFM بلغة Java خالصة
تتيح لك FFM استدعاء الدوال الأصلية والوصول إلى الذاكرة الأصلية بالكامل من Java. فلا حاجة إلى شفرة ربط بلغة C، أو خطوة ترجمة منفصلة، أو كتابة تحويلات يدوية.
تصف توقيع الدالة الأصلية في Java وتستدعيها عبر مقبض طريقة.
الحزم الأساسية
يوجد كل شيء في java.lang.foreign. والأنواع الأساسية هي:
LinkerوSymbolLookupللعثور على الدوال وربطهاMemorySegmentللذاكرة الأصليةArenaلإدارة العمر الافتراضي بصورة حتميةMemoryLayoutوFunctionDescriptorلوصف البنى
أكثر أمانًا بالتصميم
تُعد FFM أكثر أمانًا بكثير من JNI:
- الوصول إلى الذاكرة مع التحقق من الحدود
- ربط مدة الحياة بـ
Arena، ولذلك يُكتشف الاستخدام بعد التحرير - يمنع التقييد الوصول غير الآمن عبر مؤشرات الترابط
تؤدي الأخطاء إلى طرح استثناءات Java بدلًا من التسبب في تعطل الآلة الافتراضية.
لمحة عن API
يعثر هذا المثال التخطيطي على دالة C المسماة strlen ويجهّز مقبضًا لها. الفكرة هي أن كل ذلك مجرد شيفرة Java عادية.
import java.lang.foreign.*;
import java.lang.invoke.MethodHandle;
public class Main {
public static void main(String[] args) {
Linker linker = Linker.nativeLinker();
SymbolLookup stdlib = linker.defaultLookup();
MethodHandle strlen = linker.downcallHandle(
stdlib.find("strlen").orElseThrow(),
FunctionDescriptor.of(ValueLayout.JAVA_LONG, ValueLayout.ADDRESS));
System.out.println("Bound a handle to strlen: " + strlen);
}
}الأداء
تنافس استدعاءات downcall في FFM استدعاءات JNI، وغالبًا ما تتفوق عليها سرعةً، لأن JIT يستطيع تضمين الوحدات الوسيطة المُنشأة وتحسينها. ولا توجد وسيلة C وسيطة تُعبر في كل استدعاء.
تمكين الوصول إلى الشيفرة الأصلية
نظرًا إلى أن الشيفرة الأصلية قد تكون خطرة، قد تُصدر FFM تحذيرًا أو تتطلب تفعيلًا صريحًا. يمكنك منح الوصول عند التشغيل باستخدام --enable-native-access=ALL-UNNAMED (أو اسم وحدة محددة) لكتم التحذيرات.
استبدال sun.misc.Unsafe
تُعد FFM (مع Memory API) أيضًا البديل المعتمد لعمليات sun.misc.Unsafe خارج الكومة، التي أُهملت منذ فترة طويلة. ويمكن للمكتبات التي كانت تدير المخازن الأصلية يدويًا الانتقال إلى واجهات API آمنة ومدعومة.
الأدوات: jextract
بالنسبة إلى مكتبات C الكبيرة، تقرأ الأداة المصاحبة jextract ملف ترويسة C وتُنشئ تلقائيًا روابط Java الخاصة بـ FFM. وبذلك تتجنب كتابة واصفات الدوال يدويًا.
وهي النظير الذي يرفع الإنتاجية في FFM، شأنها شأن مولّد الشيفرة تقريبًا.
متى تستخدم FFM
استخدم FFM عندما تحتاج إلى:
- استدعاء مكتبة C/C++ موجودة
- التكامل مع نظام التشغيل على مستوى منخفض
- إدارة مخازن كبيرة خارج الكومة بكفاءة
أما في العمل الذي يعتمد على Java فقط، فلن تحتاج إليها مطلقًا.
تحقق سريع
تذكّر الميزة الأساسية مقارنةً بـ JNI.
مراجعة
تعلمت لماذا تتفوق FFM على JNI:
- Java خالصة، من دون شيفرة ربط بلغة C أو ترجمة إضافية
- آمنة: تتحقق من الحدود، وتدير مدة حياة Arena، وتفرض التقييد
- أداء منافس أو أفضل
- تستبدل
sun.misc.Unsafeوتتوافق معjextract
التالي: إدارة الذاكرة الأصلية باستخدام MemorySegment وArena.
الأسئلة الشائعة
هل درس «لماذا FFM بدلًا من JNI» مجاني؟
نعم — نص درس «لماذا FFM بدلًا من JNI» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «لماذا FFM بدلًا من JNI»؟
تفاعل أكثر أمانًا مع الشيفرة الأصلية تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «لماذا FFM بدلًا من JNI»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- لماذا FFM بدلًا من JNI
- MemorySegment وArena
- مقابض Downcall
- التخطيطات والهياكل