Java Съвет 23: Пишете местни методи

Възможността да се напише само един набор от код в Java и той да се изпълнява във всяка система с Java време за изпълнение е една от основните силни страни на Java. Но тази независимост на платформата има един ключов недостатък: Какво правим с огромното количество съществуващ код? Номерът е да се използва така нареченият интерфейс на родния метод .

Писането на собствени методи включва импортиране на C код във вашето Java приложение. В този съвет ще ви преведа през основната рецепта за създаване на естествени методи и използването им в Java приложение.

Седем стъпки към родния метод nirvana Стъпките за създаване на естествени методи са както следва:

  • Напишете Java код
  • Компилирайте Java код
  • Създайте заглавка C ( .h файл)
  • Създайте C мънички файл
  • Напишете C код
  • Създаване на споделена библиотека с кодове (или DLL)
  • Стартирайте приложението

Нашето упражнение е да напишем малко текст в конзолата от вътрешния метод. Спецификите на този пример ще бъдат насочени към Unix-подобна система, по-специално Linux. Ще посоча няколкото места, където детайлите се различават за другите платформи.

Напишете Java код

Напишете своя Java код както обикновено. За да използвате естествени методи във вашия Java код, трябва да направите две неща. Първо напишете декларация на естествен метод за всеки естествен метод, който искате да използвате. Това е точно като писането на декларацията на обикновен интерфейс на Java метод, но трябва да посочите родната ключова дума, както следва:

публичен естествен void printText (); 

Вторият обръч, през който трябва да преминете, е, че трябва изрично да заредите библиотеката на родния код. (Ще създадем това по-късно.) Правим това, като зареждаме библиотеката в статичен блок на класа:

static {System.loadLibrary ("щастлив"); }

За да съберете тези парчета за нашия пример, създайте файл, извикан Happy.javaсъс следното съдържание:

клас Happy {public native void printText (); static {System.loadLibrary ("щастлив"); / * Забележете малки букви на името на класа! * /} публична статична void main (String [] args) {Happy happy = new Happy (); happy.printText (); }}

Компилирайте Java код

Компилирайте Happy.javaфайла:

% javac Happy.java 

Създайте C заглавен файл

Има различни магически заклинания, които трябва да бъдат предоставени, за да може нашият C код да се използва като естествен метод. В javahфункционалността на компилаторът на Java ще генерира необходимите декларации и такива от нашия Happyклас. Това ще създаде Happy.hфайл, който да включим в нашия C код:

% javah Честит 

Създайте C мъничка файл

По начин, напомнящ манипулирането, което преводачите на C ++ правят с имената на C ++ методите, компилаторът на Java има подобна лудост. За да облекчи болката от необходимостта да пишете много досаден код, така че нашият C код да може да бъде извикан от системата за изпълнение на Java, Java компилаторът може да генерира необходимия код за батут автоматично за нас:

% javah -stubs Честит 

Напишете C код

Сега, нека напишем действителния код, за да разпечатаме нашето поздравление. По съгласие ние поставяме този код във файл, наречен след нашия Java клас с добавен към него низ "Imp". Това води до HappyImp.c. Поставете следното в HappyImp.c:

#include & ltStubPreamble.h> / * Стандартни неща от родния метод. * / #include "Happy.h" / * Генерирано по-рано. * / #include & ltstdio.h> / * Стандартни C IO неща. * / void Happy_printText (struct HHappy * this) {put ("Честита Нова Година !!!"); }

При взаимодействието на вашия C код с Java се включват много други аспекти - например как да се предават и връщат безбройните типове. За повече информация вижте урока по Java или документа на Hermetica Native Methods (вижте раздела Ресурси за URL адреси).

Създайте споделена библиотека

Този раздел е най-зависим от системата. Изглежда, че всяка платформа и всяка комбинация от компилатор / линкер имат различен метод за създаване и използване на споделени библиотеки. За хора, които използват някоя от различните платформи на Microsoft Windows, проверете документацията за вашия C компилатор за подробности.

За вас, хора от Linux, ето как да създадете споделена библиотека с помощта на GCC. Първо, компилирайте изходните файлове на C, които вече сме създали. Трябва да се каже на компилатора къде да намерите файлове за поддръжката на Java родния метод, но основният трик тук е, че трябва изрично да се каже на компилатора да произвеждат P Положение I ndependent С ода :

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

Сега създайте споделена библиотека от получените обектни (.o) файлове със следното магическо заклинание:

% gcc -споделено -Wl, -soname, libhappy.so.1 -o libhappy.so.1.0 Happy.o HappyImp.o 

Копирайте файла на споделената библиотека в стандартното кратко име:

% cp libhappy.so.1.0 libhappy.so 

И накрая, може да се наложи да кажете на динамичния си линкер къде да намери този нов споделен библиотечен файл. Използване на черупката на bash :

% износ LD_LIBRARY_PATH = `pwd`: $ LD_LIBRARY_PATH 

Изпълнете приложението

Стартирайте приложението Java както обикновено:

% java Честит 

Е, това е всичко. Благодаря на Тони Деринг за предаването на специфичните за Linux заклинания.

Бърза бележка за дизайна

Преди да се впусна да пиша местни методи за целия този наследствен код, бих предупредил всички да разгледаме внимателно съществуващите системи и да видим дали има по-добри начини да ги свържем с Java. Например има Java Database Connectivity (JDBC) и дори решения на по-високо ниво за достъп до бази данни от Java. Така че, разгледайте всички трикове в чантата си и използвайте онова, което има смисъл за настоящия проект.

Научете повече за тази тема

  • Учебно обучение по JavaSoft Native Method //www.javasoft.com/books/Series/Tutorial/native/implementing/index.html
  • Хартия за местните методи на Hermetica //www.hermetica.com/technologia/java/native/

Тази история, „Java Tip 23: Напишете собствени методи“, първоначално е публикувана от JavaWorld.