טיפ 23 של Java: כתוב שיטות מקוריות

היכולת לכתוב רק קבוצה אחת של קוד ב- Java ולהפעיל אותו בכל מערכת עם זמן ריצה של Java היא אחת מהעוצמות העיקריות של Java. אך לעצמאות הפלטפורמה הזו יש חסרון מרכזי אחד: מה עושים עם הכמות העצומה של הקוד הקיים? החוכמה היא להשתמש במה שנקרא ממשק שיטה מקורית .

כתיבת שיטות מקוריות כוללת ייבוא ​​קוד C ליישום Java שלך. בטיפ זה אעביר אתכם דרך המתכון הבסיסי ליצירת שיטות מקומיות ושימוש בהן ביישום Java.

שבעה צעדים לשיטת הילידים נירוונה השלבים ליצירת שיטות מקומיות הם כדלקמן:

  • כתוב קוד Java
  • הידור קוד Java
  • צור כותרת C ( קובץ .h )
  • צור קובץ C stubs
  • כתוב קוד C
  • צור ספריית קוד משותפת (או DLL)
  • הפעל את היישום

התרגיל שלנו הוא לכתוב קצת טקסט לקונסולה מתוך השיטה המקורית. הפרטים של דוגמה זו יכוונו למערכת דמוית יוניקס, במיוחד לינוקס. אציין את מספר הנקודות בהן הפרטים שונים בפלטפורמות אחרות.

כתוב קוד Java

כתוב את קוד ה- Java שלך כרגיל. כדי להשתמש בשיטות מקוריות בקוד Java שלך, עליך לעשות שני דברים. ראשית, כתוב הצהרת שיטה מקורית עבור כל שיטה מקורית בה ברצונך להשתמש. זה בדיוק כמו לכתוב את ההצהרה על ממשק שיטת Java רגיל, אך עליך לציין את מילת המפתח המקורית , באופן הבא:

ציבור יליד חלל printText (); 

החישוק השני לקפוץ דרכו הוא שעליך לטעון במפורש את ספריית הקוד המקורי. (אנו ניצור זאת בהמשך.) אנו עושים זאת על ידי טעינת הספרייה בגוש סטטי של הכיתה:

סטטי {System.loadLibrary ("שמח"); }

כדי להרכיב את החלקים האלה לדוגמא שלנו, צור קובץ שנקרא Happy.javaעם התוכן הבא:

class שמח {public native void printText (); סטטי {System.loadLibrary ("שמח"); / * שימו לב לאותיות קטנות של שם הכיתה! * /} סטטי ציבורי ריק ריק (String [] args) {Happy happy = new Happy (); happy.printText (); }}

הידור קוד Java

הידור Happy.javaהקובץ:

% javac Happy.java 

צור קובץ כותרת C.

ישנן כישופי קסם שונים שיש להנגישם כך שקוד C שלנו יכול לשמש כשיטה מקומית. javahהפונקציונליות של מהדר Java תפיק ההצהרות דרוש כאלה שלנו Happyבכיתה. זה ייצור Happy.hעבורנו קובץ שיכלול בקוד C שלנו:

% javah שמח 

צור קובץ C stubs

באופן שמזכיר את ההשתלשלות שעושים מתרגמי C ++ לשמות של שיטות C ++, יש למהדר Java שיגעון דומה. כדי להקל על הכאב בצורך לכתוב הרבה קוד מייגע כדי שניתן יהיה להפעיל את קוד ה- C שלנו ממערכת זמן הריצה של Java, מהדר Java יכול לייצר עבורנו את קוד הטרמפולינה הדרוש באופן אוטומטי:

% javah -stubs שמח 

כתוב קוד C

עכשיו, בואו נכתוב את הקוד בפועל כדי להדפיס את הברכה שלנו. על פי ההסכם שמנו את הקוד הזה בקובץ על שם מחלקת Java שלנו עם המחרוזת "Imp" שמצורפת אליו. התוצאה היא HappyImp.c. הצב את הדברים הבאים ב HappyImp.c:

# כלול & ltStubPreamble.h> / * דברים בשיטה מקומית סטנדרטית. * / # כלול "Happy.h" / * נוצר קודם. * / # כלול & ltstdio.h> / * דברים C IO סטנדרטיים. * / בטל Happy_printText (struct HHappy * this) {puts ("שנה טובה !!!"); }

בממשק קוד ה- C שלך ל- Java, מעורבים היבטים רבים אחרים - כגון כיצד להעביר ולהחזיר את מספר הסוגים המרובים. למידע נוסף, עיין במדריך Java או בנייר שיטות הילידים של הרמטיקה (עיין בסעיף משאבים לכתובות אתרים).

צור ספרייה משותפת

סעיף זה תלוי ביותר במערכת. נראה שלכל פלטפורמה ולכל שילוב מהדר / מקשר יש שיטה אחרת ליצור ושימוש בספריות משותפות. לאנשים המשתמשים באחת הפלטפורמות השונות של Microsoft Windows, עיין בתיעוד של מהדר ה- C שלך לקבלת הפרטים.

בשבילכם אנשי לינוקס, כך תוכלו ליצור ספרייה משותפת באמצעות GCC. ראשית, הידור את קבצי המקור C שכבר יצרנו. אתה צריך להגיד למהדר איפה למצוא את הקבצים תומכים בשיטה המקורית Java, אבל הטריק העיקרי כאן הוא שיש לך להגיד למהדר במפורש לייצר P osition שאני ndependent C תודה :

% gcc -I / usr / local / java / include -I / usr / local / java / include / genunix -fPIC -c Happy.c HappyImp.c 

כעת, צור ספרייה משותפת מתוך קבצי האובייקט (.o) שהתקבלו עם הקסם הקסום הבא:

% gcc -shared -Wl, -soname, libhappy.so.1 -o libhappy.so.1.0 Happy.o HappyImp.o 

העתק את קובץ הספרייה המשותפת לשם הקצר הסטנדרטי:

% cp libhappy.so.1.0 libhappy.so 

לבסוף, ייתכן שיהיה עליך לספר לקישור הדינמי שלך היכן למצוא את קובץ הספרייה המשותפת החדש הזה. באמצעות מעטפת הבש :

% ייצוא LD_LIBRARY_PATH = `pwd`: $ LD_LIBRARY_PATH 

בצע את היישום

הפעל את יישום Java כרגיל:

% java שמח 

ובכן, זה כל מה שיש בזה. תודה לטוני דרינג שהעביר את הלחשים הספציפיות לינוקס.

הערת עיצוב מהירה

לפני שאני ממהר לכתוב שיטות מקוריות עבור כל אותו קוד מדור קודם, הייתי מזהיר את כולנו לבחון היטב את המערכות הקיימות ולראות אם יש דרכים טובות יותר לחבר אותן לג'אווה. למשל, ישנם קישוריות Java Database (JDBC) ואפילו פתרונות ברמה גבוהה יותר לגישה למסדי נתונים מג'אווה. לכן, התבונן בכל הטריקים בתיק שלך והשתמש במה שהגיוני לפרויקט העומד על הפרק.

למידע נוסף על נושא זה

  • JavaSoft Native Method Tuturial //www.javasoft.com/books/Series/Tutorial/native/implementing/index.html
  • נייר שיטות הילידים של הרמטיקה //www.hermetica.com/technologia/java/native/

סיפור זה, "טיפ ג'אווה 23: כתוב שיטות מקוריות" פורסם במקור על ידי JavaWorld.