ครั้งแรกที่ฉันได้พบกับเนทีฟเป็นวิธีการ hashcode ใน java.lang.Object ซอร์สโค้ด:
hashcode int สาธารณะ ();
ทำไมมีคนพื้นเมือง? นี่คือสิ่งที่ฉันต้องการเรียนรู้ ดังนั้นฉันต้องการสรุปพื้นเมืองด้านล่าง
1. เข้าใจดั้งเดิมนั่นคือ Jni, Java Native Interface
ทุกภาษาหวังว่าจะบริสุทธิ์ ตัวอย่างเช่นหากคุณต้องการแก้ปัญหาบางอย่างให้เขียนในภาษานี้ แพลตฟอร์ม Java มี API สำหรับผู้ใช้ในการทำงานร่วมกับรหัส C ในเครื่องเรียกว่า Java Native Interface (Java Local Interface)
2. โทร C's "สวัสดี Jni" ใน Java
เราจำเป็นต้องทำตามขั้นตอนที่สะดวกในการออกจากงาน:
1. สร้างคลาส Java ที่มีวิธีการดั้งเดิมและวิธีการโหลดไลบรารี่ของไลบรารีโหลด Hellonative.java Code มีดังนี้:
คลาสสาธารณะ hellonative {คงที่ {system.loadLibrary ("hellonative"); } โมฆะพื้นเมืองคงที่สาธารณะ Sayshello (); @suppresswarnings ("access access") โมฆะคงที่สาธารณะหลัก (String [] args) {new hellonative (). sayhello (); -สิ่งแรกที่ควรทราบคือวิธีการดั้งเดิมและไลบรารีการโหลดยังทำงานในภายหลัง คำหลักทั่วไปบอกคอมไพเลอร์ (จริง ๆ แล้ว JVM) ว่าวิธีการที่กำหนดไว้ภายนอกและที่นี่หมายถึง C. หากคุณเรียกใช้รหัสนี้โดยตรง JVM จะบอกคุณว่า: "มีข้อยกเว้น Java เกิดขึ้น" เอาต์พุตคอนโซลมีดังนี้:
ข้อยกเว้นในด้าย "Main" java.lang.unsatisfiedlinkerror: ไม่มี hellonative ใน java.library.path ที่ java.lang.classloader.loadLibrary (แหล่งที่ไม่รู้จัก) ที่ java.lang.runtime.loadLibrary0 Hellonative. <Linit> (helonative.java:5)
นี่คือเมื่อโปรแกรมใช้มันเครื่องเสมือนบอกว่าไม่ทราบวิธีการค้นหา Sayhello คุณสามารถเขียนได้ด้วยตนเองด้านล่างดังนั้นจึงเป็นเรื่องธรรมดาที่ Mason จะใช้
2. เรียกใช้ Javah เพื่อรับไฟล์ส่วนหัวประกาศ C ที่มีวิธีการ
ใส่ hellonative.java เพียง Javac Javah ดังที่แสดงในรูป
ฉันได้ ไฟล์ hellonative.h ต่อไปนี้:
/ * อย่าแก้ไขไฟล์นี้ - มันเป็นเครื่องที่สร้างขึ้น */#รวม <jni.h>/ * ส่วนหัวสำหรับคลาส hellonative */#ifndef _included_hellonative#define _included_hellonative#ifdef __cplusplusextern jnicall java_hellonative_sayhello (jnienv *, jclass); #ifdef __cplusplus}#endif#endif
jni.h ไฟล์นี้ใน /%java_home%รวมถึง
3. เขียน C เพื่อใช้วิธีการในท้องถิ่นตามไฟล์ส่วนหัว
ที่นี่เราเพียงแค่ใช้วิธี Sayhello นี้ดังนี้:
#include "hellonative.h" #include <stdio.h> jniexport เป็นโมฆะ jnicall java_hellonative_sayhello {printf ("hello, jni"); -4. สร้างไลบรารีที่แชร์ DLL จากนั้นโหลดโปรแกรม Java และเรียกมันว่า
บน Windows Mingw GCC ทำงานดังนี้
gcc -m64 -wl, -add -stdcall -alias -i "c:/ไฟล์โปรแกรม/java/jdk1.7.0_71/รวม" -i "c:/ไฟล์โปรแกรม/Java/jdk1.7.0_71/รวม/รวม/win32"
-M64 หมายความว่าไลบรารี DLL ที่สร้างขึ้นคือ 64 บิต จากนั้นเรียกใช้ Hellonative:
Java Hellonative
ในที่สุดฉันจะเห็นว่าคอนโซลพิมพ์ดังนี้:
สวัสดี Jni
3. Jni Call C แผนภูมิการไหล
4. การแนะนำอื่น ๆ
ดั้งเดิมใช้เมื่อพัฒนาร่วมกับ C ++! คุณไม่จำเป็นต้องพัฒนา Java ด้วยตัวเอง!
ใช้คำหลักดั้งเดิมเพื่อระบุว่าวิธีนี้เป็นฟังก์ชันดั้งเดิมนั่นคือวิธีนี้ใช้ในภาษา C/C ++ และรวบรวมเป็น DLL และเรียกโดย Java
หน่วยงานการใช้งานของฟังก์ชั่นเหล่านี้ไม่รวมอยู่ในซอร์สโค้ดของ JDK และคุณไม่ควรเห็นพวกเขา พวกเขายังแตกต่างกันสำหรับแพลตฟอร์มที่แตกต่างกัน นี่เป็นกลไกพื้นฐานของ Java ในความเป็นจริง Java เรียกวิธีการดั้งเดิมที่แตกต่างกันบนแพลตฟอร์มที่แตกต่างกันเพื่อให้สามารถเข้าถึงระบบปฏิบัติการได้
1. ดั้งเดิมใช้เพื่อทำงานร่วมกับภาษาอื่น ๆ (เช่น C ++) นั่นคือการใช้งานฟังก์ชั่นดั้งเดิมไม่ได้เขียนไว้ใน Java
2. เนื่องจากไม่มี Java ไม่ต้องกังวลกับซอร์สโค้ดของมันฮ่าฮ่า
พื้นเมืองหมายถึงการแจ้งระบบปฏิบัติการ
คุณต้องใช้ฟังก์ชั่นนี้สำหรับฉันเพราะฉันต้องการใช้มัน
ดังนั้นฟังก์ชั่นของคำหลักดั้งเดิมจึงถูกนำมาใช้โดยระบบปฏิบัติการและ Java สามารถเรียกได้เท่านั้น
Java เป็นภาษาข้ามแพลตฟอร์ม เนื่องจากเป็นข้ามแพลตฟอร์มราคาที่จ่ายคือการเสียสละการควบคุมบางชั้น เพื่อให้บรรลุการควบคุมชั้นพื้นฐาน Java ต้องการความช่วยเหลือจากภาษาอื่น ๆ นี่คือบทบาทของชาวพื้นเมือง
Java ไม่สมบูรณ์แบบ นอกเหนือจากความจริงที่ว่ามันช้ากว่า C ++ แบบดั้งเดิมมากในแง่ของความเร็วในการทำงาน Java ไม่สามารถเข้าถึงระบบปฏิบัติการพื้นฐานได้โดยตรง (เช่นฮาร์ดแวร์ระบบ ฯลฯ ) ด้วยเหตุนี้ Java จึงใช้วิธีการดั้งเดิมเพื่อขยายฟังก์ชั่นของโปรแกรม Java
วิธีการดั้งเดิมสามารถเปรียบเทียบกับส่วนต่อประสานระหว่างโปรแกรม Java และโปรแกรม C และขั้นตอนการใช้งานคือ:
1. ประกาศวิธี Native () ใน Java แล้วรวบรวม;
2. ใช้ javah เพื่อสร้างไฟล์. h;
3. เขียนไฟล์. cpp เพื่อใช้วิธีการส่งออกเนทีฟซึ่งจำเป็นต้องรวมไฟล์. h ที่สร้างขึ้นในขั้นตอนที่สอง (โปรดทราบว่ามันยังมีไฟล์ jni.h กับ JDK);
4. รวบรวมไฟล์. cpp ในขั้นตอนที่สามลงในไฟล์ไลบรารีลิงก์แบบไดนามิก
5. ใช้เมธอด System.loadLibrary () เพื่อโหลดไฟล์ไลบรารีลิงก์แบบไดนามิกที่สร้างขึ้นในขั้นตอนที่ 4 ใน Java วิธีการดั้งเดิม () สามารถเข้าถึงได้ใน Java
สถานการณ์ที่ใช้วิธีการในท้องถิ่นของ Java
1. เพื่อใช้คุณสมบัติของแพลตฟอร์มโฮสต์พื้นฐานคุณลักษณะนี้ไม่สามารถเข้าถึงได้ผ่าน Java API
2. เพื่อเข้าถึงระบบเก่าหรือใช้ไลบรารีที่มีอยู่ระบบหรือไลบรารีนี้ไม่ได้เขียนใน Java
3. เพื่อเพิ่มประสิทธิภาพการทำงานของโปรแกรมระยะเวลาของรหัสที่ละเอียดอ่อนจะถูกนำมาใช้เป็นวิธีการในท้องถิ่น
บทความข้างต้นเข้าใจบทบาทของคำหลักใน Java อย่างครอบคลุมเป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น