1. บทนำสู่ JNI
JNI เป็นตัวย่อภาษาอังกฤษของอินเทอร์เฟซดั้งเดิมของ Java ซึ่งหมายถึงอินเตอร์เฟส Java Local
แหล่งที่มาของปัญหา: เนื่องจากเป็นการยากที่จะใช้แอปพลิเคชันพื้นฐานของการเขียน Java Java จึงยากที่จะจัดการในบางส่วนที่มีข้อกำหนดแบบเรียลไทม์สูงมาก (ยังไม่มีพื้นที่ที่มีความต้องการแบบเรียลไทม์สูงและหัวข้อต่างๆเช่นต้องตรวจสอบตามเวลาจริง)
วิธีแก้ปัญหา: Java ใช้ JNI เพื่อเรียกไลบรารีท้องถิ่นที่มีอยู่ (C/C ++ เพื่อพัฒนาโปรแกรมที่เกี่ยวข้องกับระบบและห้องสมุดคลาส) ซึ่งพัฒนา Java อย่างยืดหยุ่นอย่างมาก
2. การสอนการเรียนรู้อย่างรวดเร็ว JNI
2.1 คำถาม:
เขียนโค้ดชิ้นหนึ่งโดยใช้ jni ใช้ string_java_test_helloworld (jnienv *env, jclass cls, jstring j_str) ฟังก์ชั่นใช้งานการเพิ่ม Hello ต่อหน้าสตริง j_str ("โลก") และกลับมา
2.2 กระบวนการแก้ไขปัญหา:
I. เขียนคลาส test.java:
การทดสอบคลาสสาธารณะ {// อินเทอร์เฟซดั้งเดิมสตริงดั้งเดิมของสตริง helloWorld (ข้อความสตริง); โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// โหลดระบบไลบรารีไดนามิก loadLibrary ("test2"); ทดสอบ ts = การทดสอบใหม่ (); สตริงข้อความ = ts.helloworld ("โลก"); System.out.println (ข้อความ); -คำพูด:
1. โหลดไลบรารีคลาสไดนามิก: System.loadLibrary ("Test2"); [อันที่โหลดใน Windows คือ test2.dll และสิ่งที่โหลดใน Linux คือ test2.so]
ii. คอมไพล์ test.java ไฟล์
ป้อน cmd เพื่อป้อนคำสั่ง> javac test.java
iii. สร้างไฟล์ test.h
ป้อนคำสั่งอินพุต cmd> การทดสอบ Javah
เนื้อหาของไฟล์ test.h มีดังนี้:
/ * อย่าแก้ไขไฟล์นี้ - เป็นเครื่องที่สร้างขึ้น */#รวม <jni.h>/ * ส่วนหัวสำหรับการทดสอบคลาส */#ifndef _included_test#define _included_test#ifdef __cplusplusextern "C" {#endif/ * (ljava/lang/string;) ljava/lang/string; */jniexport jstring jnicall java_test_helloworld (jnienv *, jobject, jstring);#ifdef __cplusplus}#endif#endifคำพูด:
1. การประกาศฟังก์ชั่น, รูปแบบคงที่: jniexport; Type Return: JString; Jni Call: Jnicall; JAVA_FULL คลาส NAME_METHOD ชื่อ: JAVA_TEST_HOLLANDORLD;
2. พารามิเตอร์ฟังก์ชั่น: โทร jni.h ไปยังตัวชี้ฟังก์ชั่นที่ห่อหุ้ม: jnienv; คลาส Java เอง: Jobject, ไฟล์ Java ผ่านพารามิเตอร์: JString
iv. เขียนไฟล์ภาษา c test2.c เพื่อใช้ฟังก์ชั่นของคลาสทดสอบการเรียกไลบรารีไดนามิกลิงค์ไดนามิก:
#include "test.h" #include <string.h> jniexport jstring jnicall java_test_helloworld (jnienv*env, งาน obj, jstring string) {const char*str = (*env)-> getStringutfchars (env, env, 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. GetStringUtfChars () และ NewStringUtf () ครั้งแรกคือรูปแบบการเข้ารหัสที่แปลงจาก UTF8 เป็น C และที่สองคือการส่งคืนสตริง UTF8 ตามสตริงของ C;
3. releasestringutfchars () ใช้เพื่อปล่อยวัตถุ มีเครื่องเสมือนจริงใน Java สำหรับการรวบรวมขยะ แต่ในภาษา C วัตถุเหล่านี้จะต้องรีไซเคิลด้วยตนเองมิฉะนั้นการรั่วไหลของหน่วยความจำอาจเกิดขึ้น
V. รวบรวมและเรียกใช้
การรวบรวม:
ป้อนคำสั่ง cmd input> gcc -i "d:/ไฟล์โปรแกรม/java/jdk1.8.0_45/รวม" -i "d:/ไฟล์โปรแกรม/Java/jdk1.8.0_45/include/win32" -Share test2.c -o test2.dll
วิ่ง:
ป้อน CMD เพื่อป้อนคำสั่ง> การทดสอบ Java
ผลการดำเนินการมีดังนี้:
HelloWorld
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 เบื้องต้นข้างต้น (แนะนำ) เป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น