1. ما هي الطريقة الأصلية
ببساطة ، الطريقة الأصلية هي واجهة تقوم فيها Java باستدعاء رمز غير جافا. الطريقة الأصلية هي طريقة Java: يتم تنفيذ هذه الطريقة من قبل لغة غير جافا ، مثل C. هذه الميزة ليست فريدة من نوعها لـ Java. العديد من لغات البرمجة الأخرى لديها هذه الآلية. على سبيل المثال ، في C ++ ، يمكنك استخدام Extern "C" لإخبار برنامج التحويل البرمجي C ++ بالاتصال بوظيفة C.
"الطريقة الأصلية هي طريقة Java التي يتم توفير تنفيذها بواسطة رمز غير جافا."
عند تحديد طريقة أصلية ، لا يتم توفير هيئة التنفيذ (بعضها يشبه تحديد واجهة Java) ، لأن هيئة التنفيذ الخاصة بها يتم تنفيذها في الخارج بواسطة لغة غير جافا. ، إليك مثال:
حزمة java.lang ؛ كائن الفئة العامة {...... الفئة الأصلية النهائية العامة <؟> getClass () ؛ Hashcode الأصلي العام () ؛ استنساخ الكائن الأصلي المحمي () يلقي clonenotsupportedException ؛ الفراغ النهائي العام الإخطار () ؛ الفراغ النهائي العام الإخطار () ؛ رميات الفراغ النهائي النهائي (فترة طويلة) رميات المقاطعات ؛ ......}يمكن استخدام المعرف الأصلي مع جميع معرفات Java الأخرى ، باستثناء الملخص. هذا أمر معقول لأن مواطنه يعني أن هذه الأساليب لها هيئات تنفيذ ، لكن هيئات التنفيذ هذه غير جافا ، لكن المجردة تشير بوضوح إلى أن هذه الأساليب ليس لها هيئات تنفيذ. عند استخدام معرفات Java الأصلية وغيرها من المعرفات ، لا يختلف معناها عن المعرفات غير الأصلية.
يمكن لطريقة الطريقة الأصلية إرجاع أي نوع من نوع Java ، بما في ذلك الأنواع غير المحددة ، ويمكنها أيضًا إجراء التحكم في الاستثناء. يمكن أن يؤدي تنفيذ هذه الأساليب إلى جعل استثناء ورميها ، وهو ما يشبه إلى حد كبير طريقة Java.
إن وجود الطريقة الأصلية ليس له أي تأثير على فئات أخرى تسمي هذه الأساليب المحلية. في الواقع ، لا تعرف الفصول الأخرى التي تسمي هذه الأساليب حتى أنها تسمي طريقة محلية. سيتحكم JVM في جميع تفاصيل استدعاء الطريقة المحلية.
إذا تم توريث فئة تحتوي على طريقة محلية ، فإن الفئة الفرعية سترث الطريقة المحلية ويمكنها إعادة كتابة الطريقة في Java (يبدو هذا غريبًا بعض الشيء). وبالمثل ، إذا تم تحديد طريقة محلية بواسطة Fianl ، فلا يمكن إعادة كتابة بعد أن تم موروثها.
الأساليب المحلية مفيدة للغاية لأنها توسع بشكل فعال JVM. في الواقع ، استخدم رمز Java الذي نكتبه الأساليب المحلية. في تنفيذ آلية Sun's Java Concurrency (متعددة الخيوط) ، تستخدم العديد من نقاط الاتصال مع نظام التشغيل الطرق المحلية ، والتي تمكن برامج Java من تجاوز حدود وقت تشغيل Java. مع الأساليب المحلية ، يمكن لبرامج Java القيام بأي مهام على مستوى التطبيق.
2. كيفية الاستخدام
تشير الكلمة الرئيسية الأصلية إلى أن طريقة التعديل الخاصة بها هي طريقة أصلية. التنفيذ المقابل للطريقة ليس في الملف الحالي ، ولكن في الملفات التي تم تنفيذها بلغات أخرى (مثل C و C ++). لا تستطيع لغة Java نفسها الوصول إلى الطبقة الأساسية لنظام التشغيل وتشغيلها ، ولكن يمكنها استخدام واجهة JNI لاستدعاء لغات أخرى لتحقيق الوصول إلى الطبقة الأساسية.
JNI هي واجهة Java الأصلية ، وهي واجهة برمجة أصلية ، وهي جزء من مجموعة تطوير برامج Java (SDK). يتيح JNI رمز Java باستخدام قواعد الرمز والرمز المكتوبة بلغات أخرى. يمكن استخدام واجهة برمجة تطبيقات الاحتجاج (جزء من JNI) لتضمين الأجهزة الافتراضية Java (JVMs) في التطبيقات الأصلية ، مما يسمح للمبرمجين بالاتصال بدولة Java من داخل الكود الأصلي.
However, calls to external Java cannot usually be ported to other platforms, and security exceptions may also be raised in applets. سيؤدي تطبيق الكود الأصلي إلى منع تطبيق Java الخاص بك من اجتياز اختبار Java الخالص بنسبة 100 ٪. ومع ذلك ، إذا كان يجب إجراء مكالمة محلية ، فهناك العديد من الإرشادات التي يجب مراعاتها:
1. قم بتغليف جميع أساليبك المحلية في فصل يدعو DLL واحد. لكل نظام نظام تشغيل مستهدف ، يمكن استخدام إصدار من DLL الخاص بالمنصة المناسبة. هذا يقلل من تأثير الكود المحلي ويساعد في مراعاة مشكلات النقل المطلوبة لاحقًا.
2. الطريقة المحلية بسيطة قدر الإمكان. حاول تقليل اعتماد الطريقة المحلية على DLLs لجهة خارجية (بما في ذلك Microsoft). اجعل طريقتك المحلية مستقلة قدر الإمكان لتقليل النفقات العامة المطلوبة لتحميل DLL والتطبيق. إذا كان DLL وقت التشغيل مطلوبًا ، فيجب تزويده بالتطبيق.
خطوات كتابة JNI هي كما يلي:
فيما يلي مثال بسيط على استدعاء برنامج C المحلي في Java:
أ. اكتب HelloWorld.Java Class
class helloWorld {public native void hello () ؛ static {system.loadlibrary ("hello") ؛} الفراغ الثابت العام (String [] args) {new HelloWorld (). hello () ؛}}ب. ترجمة
Javac HelloWorld.java
ج. توليد ملف .h
جافاه -جني هيلوورلد
المحتوى الذي تم إنشاؤه هو كما يلي:
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class HelloWorld */#ifndef _Included_HelloWorld#define _Included_HelloWorld#ifdef __cplusplusextern "C" {#endif/** Class: HelloWorld* Method: hello* Signature: ()V*/JNIEXPORT void jnicall java_helloworld_hello (jnienv *، jobject) ؛#ifdef __cplusplus}#endif#endifالمعلمة الأولى هي مؤشر بيئة JNI المستخدمة عند استدعاء طريقة JNI. المعلمة الثانية هي مقبض لكائن Java HelloWorld الذي تم إنشاءه في رمز Java هذا. المعلمات الأخرى هي معلمات الطريقة نفسها
تنفيذ DC
#include <jni.h> #include "helloworld.h" #include <stdio.h> jniexport void jnicall java_helloworld_hello (jnienv *env ، jobj abj) {printf ("hello world!/n") ؛ return ؛}من بينها ، السطر الأول هو تقديم ملف jni.h (في ٪ java_home ٪/دليل) ، والذي يحتوي على تعريفات Jnienv و Jobject.
ه. تجميع تنفيذ ج
هنا ، أخذ Windows كمثال ، تحتاج إلى إنشاء ملف DLL. تحت مجلد Save HelloWorldImpl.C ، استخدم برنامج التحويل البرمجي VC لإنشائه.
cl -i ٪ java_home ٪/تشمل -i ٪ java_home ٪/تشمل/win32 -ld helloworldimp.c -fehello.dll
ملاحظة: تم تكوين اسم ملف DLL الذي تم إنشاؤه بعد الخيار -F ، إليك Hello ، لأن الاسم الذي نستخدمه عند LoadLibary في ملف HelloWorld.java هو Hello. بالطبع ، بعد التعديل هنا ، يجب تعديله أيضًا. بالإضافة إلى ذلك ، يجب إضافة معلمة java_home ٪/تشمل -i ٪ java_home ٪/تشمل/win32 ، لأنه يتم تقديم ملف jni.h عند كتابة الطريقة المحلية في الخطوة الرابعة.
و. تشغيل البرنامج
Java HelloWorld على ما يرام!
ما سبق هو مقدمة مفصلة للكلمات الرئيسية الأصلية في جافا ، وآمل أن تكون مفيدة لتعلم الجميع.