Programování

Tip Java 23: Napište nativní metody

Schopnost napsat pouze jednu sadu kódu v Javě a nechat ji běžet na každém systému s běhovým procesem Java je jednou z hlavních silných stránek Javy. Nezávislost této platformy má ale jednu klíčovou nevýhodu: Co uděláme s velkým množstvím existujícího kódu? Trik spočívá v použití tzv rozhraní nativní metody.

Psaní nativních metod zahrnuje import kódu C do vaší aplikace Java. V tomto tipu vás provedu základním receptem na vytváření nativních metod a jejich použití v aplikaci Java.

Sedm kroků k nativní metodě nirvana Kroky k vytvoření nativních metod jsou následující:

  • Napište kód Java
  • Kompilace kódu Java
  • Vytvořte záhlaví C (.h soubor)
  • Vytvořit C. pahýly soubor
  • Napište kód C.
  • Vytvoření sdílené knihovny kódů (nebo DLL)
  • Spusťte aplikaci

Naším cvičením je napsat nějaký text do konzoly zevnitř nativní metody. Specifika tohoto příkladu budou zaměřena na unixový systém, konkrétně Linux. Poukážu na pár míst, kde se podrobnosti u jiných platforem liší.

Napište kód Java

Napište svůj kód Java, jako byste normálně psali. Chcete-li v kódu Java použít nativní metody, musíte udělat dvě věci. Nejprve napište deklaraci nativní metody pro každou nativní metodu, kterou chcete použít. Je to jako psaní deklarace normálního rozhraní metody Java, ale musíte zadat rodák klíčové slovo takto:

public native void printText (); 

Druhá obruč, kterou chcete přeskočit, je, že musíte explicitně načíst knihovnu nativního kódu. (Vytvoříme to později.) Uděláme to načtením knihovny ve statickém bloku třídy:

static {System.loadLibrary ("šťastný"); } 

Chcete-li tyto části dát dohromady pro náš příklad, vytvořte soubor s názvem Happy.java s následujícím obsahem:

třída Happy {public native void printText (); static {System.loadLibrary ("šťastný"); / * Všimněte si malých písmen názvu třídy! * /} public static void main (String [] args) {Happy happy = new Happy (); happy.printText (); }} 

Kompilace kódu Java

Zkompilovat Happy.java soubor:

% javac Happy.java 

Vytvořte soubor záhlaví C.

Aby bylo možné náš kód C použít jako nativní metodu, je třeba zpřístupnit různé magické zaklínadla. The javah funkce kompilátoru Java vygeneruje potřebná prohlášení a podobně z naší Šťastný třída. Tím se vytvoří Happy.h soubor, který máme zahrnout do našeho kódu C:

% javah Šťastný 

Vytvořte soubor C stubs

Způsob, který připomíná mangling, který překladači C ++ dělají jménům metod C ++, má kompilátor Java podobné šílenství. Abychom zmírnili bolest při psaní zdlouhavého kódu, aby bylo možné náš kód C vyvolat z běhového systému Java, může kompilátor Java pro nás automaticky vygenerovat potřebný trampolínový kód:

% javah -stubs Šťastný 

Napište kód C.

Nyní napíšeme skutečný kód, který vytiskne náš pozdrav. Podle konvence jsme tento kód vložili do souboru pojmenovaného po naší třídě Java s připojeným řetězcem „Imp“. Výsledkem je HappyImp.c. Vložte následující do HappyImp.c:

#include & ltStubPreamble.h> / * Standardní nativní metody. * / #include "Happy.h" / * Generováno dříve. * / #include & ltstdio.h> / * Standardní C IO věci. * / void Happy_printText (struct HHappy * this) {puts ("Šťastný nový rok !!!"); } 

Při propojení vašeho C kódu s Javou je zahrnuto mnoho dalších aspektů - například jak předat a vrátit nesčetné typy. Další informace najdete v kurzu Java nebo v dokumentu Hermetica Native Methods Paper (adresy URL najdete v části Zdroje).

Vytvořte sdílenou knihovnu

Tato část je nejvíce závislá na systému. Vypadá to, že každá platforma a každá kombinace kompilátoru / linkeru má jinou metodu vytváření a používání sdílených knihoven. Pro lidi, kteří používají některou z různých platforem Microsoft Windows, podívejte se do dokumentace ke svému kompilátoru C, kde najdete podrobnosti o drsnosti.

Pro vás Linux lidi, tady je návod, jak vytvořit sdílenou knihovnu pomocí GCC. Nejprve zkompilujte zdrojové soubory C, které jsme již vytvořili. Musíte říct kompilátoru, kde najít podpůrné soubory nativní metody Java, ale hlavním trikem je, že musíte výslovně říct kompilátoru, aby vytvořil Posice nezávislý Códa:

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

Nyní vytvořte sdílenou knihovnu z výsledných souborů objektů (.o) s následujícím magickým zaklínadlem:

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

Zkopírujte soubor sdílené knihovny na standardní krátký název:

% cp libhappy.so.1.0 libhappy.so 

Nakonec možná budete muset svému dynamickému linkeru sdělit, kde tento nový soubor sdílené knihovny najdete. Za použití bash skořápka:

% export LD_LIBRARY_PATH = `pwd`: $ LD_LIBRARY_PATH 

Spusťte aplikaci

Spusťte aplikaci Java jako obvykle:

% java šťastný 

No, to je vše. Díky Tonymu Deringovi za předání zaklínadel specifických pro Linux.

Rychlá poznámka k návrhu

Než se pustíme do psaní nativních metod pro celý tento starší kód, varoval bych nás všechny, abychom se pečlivě podívali na stávající systémy a zjistili, zda existují lepší způsoby, jak je připojit k Javě. Například existují Java Database Connectivity (JDBC) a ještě vyšší řešení pro přístup k databázím z Javy. Podívejte se tedy na všechny triky v tašce a použijte to, co má smysl pro daný projekt.

Další informace o tomto tématu

  • Výukový program nativních metod JavaSoft //www.javasoft.com/books/Series/Tutorial/native/implementing/index.html
  • Hermetica Native Methods Paper //www.hermetica.com/technologia/java/native/

Tento příběh, „Java Tip 23: Write native methods“, původně publikoval JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found