1. مقدمة إلى JNI
JNI هو اختصار اللغة الإنجليزية للواجهة الأصلية Java ، وهذا يعني واجهة Java المحلية.
مصدر المشكلة: نظرًا لأنه من الصعب تنفيذ التطبيق الأساسي لكتابة Java ، يصعب التعامل مع Java في بعض الأجزاء ذات المتطلبات العالية جدًا في الوقت الفعلي (لا توجد مجالات ذات متطلبات عالية في الوقت الفعلي ، ويحتاج مواضيع مثل الوقت الفعلي إلى التحقيق).
الحل: تستخدم JAVA JNI للاتصال بالمكتبات المحلية الحالية (C/C ++ لتطوير أي برامج ومكتبات فئة متعلقة بالنظام) ، والتي تطور بشكل كبير Java بشكل كبير.
2. جيني التعلم التعليمي التعليمي
2.1 السؤال:
اكتب قطعة رمز باستخدام JNI ، وقم بتنفيذ وظيفة string_java_test_helloworld (jnienv *env ، jclass cls ، jstring j_str) ، قم بتنفيذ إضافة hello أمام السلسلة j_str ("World") والعودة.
2.2 عملية حل المشكلات:
أولا اكتب فئة test.java:
اختبار الفئة العامة {// الواجهة الأصلية السلسلة الأصلية HelloWorld (نص سلسلة) ؛ public static void main (string [] args) {// تحميل نظام المكتبة الديناميكي. اختبار ts = اختبار جديد () ؛ نص سلسلة = ts.helloworld ("العالم") ؛ system.out.println (text) ؛ }}ملاحظة:
1. تحميل مكتبة الفئة الديناميكية: System.LoadLibrary ("Test2") ؛ [الشخص الذي تم تحميله في Windows هو Test2.dll ، والذات التي يتم تحميلها في Linux هي test2.so]
الثاني. تجميع ملف test.java
أدخل CMD لإدخال الأمر> javac test.java
ثالثا. إنشاء ملف test.h
أدخل أمر إدخال CMD> اختبار Javah
محتويات ملف test.h هي كما يلي:
/ * لا تقم بتحرير هذا الملف - تم إنشاؤه الجهاز */#include <jni.h>/ * header لاختبار الفئة */#ifndef _included_test#define _included_test#ifdef __cplusplusester "c" {#endif/ * * * (ljava/lang/string ؛) ljava/lang/string ؛ */jniexport jstring jnicall java_test_helloworld (jnienv *، Jobject ، jstring) ؛#ifdef __cplusplus}#endif#ملاحظة:
1. إعلان الوظيفة ، التنسيق الثابت: Jniexport ؛ نوع العودة: JSTRING ؛ جيني Call: Jnicall ؛ java_full class name_method الاسم: java_test_helloworld ؛
2. معلمات الوظيفة: اتصل على jni.h إلى مؤشر الوظيفة المغطاة: Jnienv ؛ فئة Java نفسها: Jobject ، تم تمرير ملف Java: JSTRING.
رابعا. اكتب اختبار ملف C Language Test2.c لتنفيذ وظيفة مكتبة الارتباط الديناميكية لاتصال الفئة الاختبار:
#include "test.h" #include <string.h> jniexport jstring jnicall java_test_helloworld (jnienv*env ، Job Obj ، jstring string) {const char*str = (*env)-> getstringutfchars (env ، string ، 0) ؛ غطاء شار [128] ؛ CAP [0] = 'H' ؛ CAP [1] = 'e' ؛ CAP [2] = 'l' ؛ CAP [3] = 'l' ؛ CAP [4] = 'o' ؛ Strcat (Cap ، Str) ؛ (*env)-> releasestringutfchars (env ، string ، 0) ؛ Return (*env)-> newstringutf (env ، cap) ؛ }ملاحظة:
1. نظرًا لأن Java نفسها تستخدم أحرفًا مزدوجة البايت ، فإن لغة C نفسها هي أحرف بايت أحادية البايت ، لذلك تحتاج إلى استخدام (*env)-> getStringUtfchars () لتحويل السلسلة بين Java و C ؛
2. الأول هو تنسيق الترميز الذي تم تحويله من UTF8 إلى C ، والثاني هو إرجاع سلسلة UTF8 استنادًا إلى سلسلة C ؛
3. يتم استخدام RELEASESTRINGUTFCHARS () لإطلاق الكائنات. هناك أجهزة افتراضية في Java لجمع القمامة ، ولكن بلغة C ، يجب إعادة تدوير هذه الكائنات يدويًا ، وإلا فقد تحدث تسرب الذاكرة.
خامسا ترجمة وتشغيل
التجميع:
أدخل أمر إدخال CMD> gcc -i "d:/program files/java/jdk1.8.0_45/include" -i "d:/program files/java/jdk1.8.0_45/include/win32" -share test2. o test2.dll
يجري:
أدخل CMD لإدخال الأمر> اختبار Java
نتائج التشغيل كما يلي:
مرحبا بالعالم
3. ملخص:
الخطوة 1: اكتب فئة Java (test.java) مع الأساليب الأصلية ، واستخدم أداة Javac لتجميع فئة Java (إنشاء test.class) ؛
الخطوة 2: استخدم Javah لإنشاء ملف الرأس (test.h) المقابل للطريقة الأصلية ؛
الخطوة 3: استخدم C/C ++ لتنفيذ ملف الرأس المقابل (Test2.c) وتجميعه في مكتبة ارتباط ديناميكية (Test2.so).
البيئة الجارية لهذه المقالة: نظام التشغيل Windows 64 بت ، JDK الإصدار 1.8 ، MINGW64 (GCC).
البرنامج التعليمي Java Jni Quick Intorial (الموصى به) هو كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.