1. วิธีการดั้งเดิมคืออะไร
พูดง่ายๆคือวิธีการดั้งเดิมเป็นอินเทอร์เฟซที่ Java เรียกรหัสที่ไม่ใช่ Java วิธีการดั้งเดิมคือวิธี Java: การใช้วิธีนี้ใช้โดยภาษาที่ไม่ใช่ภาษาชวาเช่น C. คุณลักษณะนี้ไม่ซ้ำกับ Java ภาษาการเขียนโปรแกรมอื่น ๆ อีกมากมายมีกลไกนี้ ตัวอย่างเช่นใน C ++ คุณสามารถใช้ "C" ภายนอกเพื่อบอกคอมไพเลอร์ C ++ เพื่อเรียกใช้ฟังก์ชัน C
"วิธีการดั้งเดิมเป็นวิธี Java ที่มีการใช้งานโดยรหัสที่ไม่ใช่ Java"
เมื่อกำหนดวิธีการดั้งเดิมจะไม่ได้รับการจัดเตรียมร่างกาย (บางส่วนก็เหมือนกับการกำหนดอินเทอร์เฟซ Java) เนื่องจากร่างกายนำไปใช้งานจะถูกนำไปใช้ภายนอกโดยภาษาที่ไม่ใช่ Java นี่คือตัวอย่าง:
แพ็คเกจ java.lang; วัตถุระดับสาธารณะ {...... คลาสพื้นเมืองสาธารณะสุดท้าย <?> getClass (); hashcode int สาธารณะ (); ได้รับการป้องกันวัตถุพื้นเมืองโคลน () พ่น clonenotsupportedexception; โมฆะพื้นเมืองสุดท้ายสาธารณะแจ้งเตือน (); โมฆะพื้นเมืองสุดท้ายสาธารณะ Notifyall (); Public Final Native Void Wait (Long Wiseout) พุ่งเข้าหาการขัดจังหวะ; -Identifier Native สามารถใช้กับตัวระบุ Java อื่น ๆ ทั้งหมดยกเว้นนามธรรม สิ่งนี้สมเหตุสมผลเพราะพื้นเมืองบอกเป็นนัยว่าวิธีการเหล่านี้มีหน่วยงานดำเนินการ แต่หน่วยงานนำไปปฏิบัติเหล่านี้ไม่ใช่ Java แต่นามธรรมแสดงให้เห็นอย่างชัดเจนว่าวิธีการเหล่านี้ไม่มีหน่วยงาน เมื่อมีการใช้ตัวระบุ Java และอื่น ๆ ความหมายของพวกเขาจะไม่แตกต่างจากวิธีการที่ไม่ใช่เจ้าของภาษา
วิธีการแบบดั้งเดิมสามารถส่งคืนประเภท Java ใด ๆ รวมถึงประเภทที่ไม่ได้ใช้งานและยังสามารถควบคุมข้อยกเว้นได้ การใช้วิธีการเหล่านี้สามารถสร้างข้อยกเว้นและโยนมันซึ่งคล้ายกับวิธีการของ Java
การมีอยู่ของวิธีการดั้งเดิมไม่มีผลกระทบใด ๆ ต่อคลาสอื่น ๆ ที่เรียกวิธีการในท้องถิ่นเหล่านี้ ในความเป็นจริงคลาสอื่น ๆ ที่เรียกว่าวิธีการเหล่านี้ไม่รู้ด้วยซ้ำว่ามันกำลังเรียกวิธีการในท้องถิ่น JVM จะควบคุมรายละเอียดทั้งหมดของการเรียกวิธีการในท้องถิ่น
หากคลาสที่มีวิธีการในท้องถิ่นได้รับการสืบทอดคลาสย่อยจะสืบทอดวิธีการในท้องถิ่นและสามารถเขียนวิธีการใหม่ใน Java (ดูเหมือนจะแปลกเล็กน้อย) ในทำนองเดียวกันหากมีการระบุวิธีการในท้องถิ่นโดย fianl มันจะไม่สามารถเขียนใหม่ได้หลังจากได้รับการสืบทอด
วิธีการในท้องถิ่นมีประโยชน์มากเพราะขยาย JVM ได้อย่างมีประสิทธิภาพ อันที่จริงแล้วรหัส Java ที่เราเขียนได้ใช้วิธีการในท้องถิ่น ในการใช้งานกลไกการทำงานร่วมกันของ Java (มัลติเธรด) ของ Sun จุดติดต่อจำนวนมากที่มีระบบปฏิบัติการใช้วิธีการในท้องถิ่นซึ่งช่วยให้โปรแกรม Java เกินขอบเขตของรันไทม์ Java ด้วยวิธีการในท้องถิ่นโปรแกรม Java สามารถทำงานระดับแอปพลิเคชันได้
2. วิธีใช้
คำหลักดั้งเดิมระบุว่าวิธีการปรับเปลี่ยนเป็นวิธีดั้งเดิม การใช้งานที่สอดคล้องกันของวิธีการไม่ได้อยู่ในไฟล์ปัจจุบัน แต่ในไฟล์ที่ใช้งานในภาษาอื่น ๆ (เช่น C และ C ++) ภาษา Java นั้นไม่สามารถเข้าถึงและใช้งานเลเยอร์พื้นฐานของระบบปฏิบัติการได้ แต่สามารถใช้อินเตอร์เฟส JNI เพื่อโทรหาภาษาอื่นเพื่อให้ได้การเข้าถึงเลเยอร์พื้นฐาน
JNI เป็นอินเทอร์เฟซ Java Native ซึ่งเป็นอินเทอร์เฟซการเขียนโปรแกรมดั้งเดิมซึ่งเป็นส่วนหนึ่งของชุดพัฒนาซอฟต์แวร์ Java (SDK) JNI อนุญาตให้รหัส Java ใช้รหัสและฐานรหัสที่เขียนเป็นภาษาอื่น การเรียกใช้ API (ส่วนหนึ่งของ JNI) สามารถใช้ในการฝังเครื่องเสมือน Java (JVMs) ลงในแอปพลิเคชันดั้งเดิมช่วยให้โปรแกรมเมอร์เรียกรหัส Java จากรหัสดั้งเดิมภายใน
อย่างไรก็ตามการโทรไปยังชวาภายนอกมักจะไม่สามารถส่งไปยังแพลตฟอร์มอื่น ๆ ได้และอาจมีการยกระดับความปลอดภัยในแอปเปิล การใช้รหัสดั้งเดิมจะป้องกันไม่ให้แอปพลิเคชัน Java ของคุณผ่านการทดสอบ Java บริสุทธิ์ 100% อย่างไรก็ตามหากต้องดำเนินการโทรในท้องถิ่นมีแนวทางหลายประการที่ต้องพิจารณา:
1. ห่อหุ้มวิธีการในพื้นที่ทั้งหมดของคุณลงในคลาสที่เรียก DLL เดียว สำหรับแต่ละแพลตฟอร์มระบบปฏิบัติการเป้าหมายสามารถใช้ DLL รุ่นเฉพาะกับแพลตฟอร์มที่เหมาะสมได้ สิ่งนี้จะช่วยลดผลกระทบของรหัสท้องถิ่นและช่วยคำนึงถึงปัญหาการพอร์ตที่จำเป็นในภายหลัง
2. วิธีการในท้องถิ่นนั้นง่ายที่สุดเท่าที่จะทำได้ พยายามลดการพึ่งพาวิธีการในพื้นที่ของคุณให้น้อยที่สุดกับบุคคลที่สาม (รวมถึง Microsoft) Runtime DLLS ทำให้วิธีการในพื้นที่ของคุณเป็นอิสระมากที่สุดเพื่อลดค่าใช้จ่ายที่จำเป็นในการโหลด DLL และแอปพลิเคชันของคุณ หากจำเป็นต้องใช้ DLL รันไทม์จะต้องมีแอปพลิเคชัน
ขั้นตอนการเขียนของ JNI มีดังนี้:
นี่คือตัวอย่างง่ายๆของการเรียกโปรแกรม C ท้องถิ่นใน Java:
. เขียนชั้นเรียน helloworld.java
ชั้นเรียน helloWorld {โมฆะประชาชน Native Hello (); Static {System.loadLibrary ("Hello");} โมฆะสาธารณะคงข. การแปล
javac helloworld.java
ค. สร้างไฟล์. h
javah -jni helloworld
เนื้อหาที่สร้างขึ้นมีดังนี้:
/* อย่าแก้ไขไฟล์นี้ - เป็นเครื่องที่สร้างขึ้น*/#รวม <jni.h>/* ส่วนหัวสำหรับคลาส helloWorld*/#ifndef _included_helloworld#define _included_helloworld#ifdef __cplusplusextern 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 เป็นโมฆะ jnicall java_helloworld_hello (jnienv *env, Jobject obj) {printf ("Hello World!/n");ในหมู่พวกเขาบรรทัดแรกคือการแนะนำไฟล์ jni.h (ใน %java_home %/รวมไดเรกทอรี) ซึ่งมีคำจำกัดความของ JNienv และ Jobject
ก. รวบรวมการใช้งาน C
ที่นี่การใช้ Windows เป็นตัวอย่างคุณต้องสร้างไฟล์ DLL ภายใต้โฟลเดอร์ Save HelloWorldimpl.C ใช้คอมไพเลอร์ VC เพื่อสร้าง
cl -i%java_home%/รวม -i%java_home%/include/win32 -ld helloWorldimp.c -fehello.dll
หมายเหตุ: ชื่อไฟล์ DLL ที่สร้างขึ้นได้รับการกำหนดค่าหลังจากตัวเลือก -fe นี่คือสวัสดีเพราะชื่อที่เราใช้เมื่อโหลด LoadLibary ในไฟล์ helloWorld.java คือสวัสดี แน่นอนหลังจากการดัดแปลงที่นี่ก็ต้องมีการแก้ไขที่นั่น นอกจากนี้ -i%java_home%/include -i%java_home%/include/win32 ต้องเพิ่มพารามิเตอร์เนื่องจากไฟล์ jni.h ถูกนำมาใช้เมื่อเขียนวิธีการท้องถิ่นในขั้นตอนที่สี่
f. เรียกใช้โปรแกรม
Java HelloWorld โอเค!
ข้างต้นเป็นการแนะนำรายละเอียดเกี่ยวกับคำหลักใน Java และฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคน