<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wx="http://ilps.science.uva.nl/WikiXML/wx" xml:lang="nl" lang="nl">
<head>
<title>Java Native Interface</title>
<meta name="wx_namespace" content="0"/>
<meta name="wx_pagename" content="Java_Native_Interface"/>
<meta name="wx_page_id" content="217773"/>
</head>
<body>
<div id="wx_article">
<wx:section level="1" title="Java Native Interface" id="wxsec1"><h1 class="pagetitle" id="wx1">Java Native Interface</h1>

<wx:template id="wx_t1" pagename="Sjabloon:Portaal" page_id="191540"/>
<table class="toccolours" cellpadding="0" cellspacing="0" style="float: right; margin: 0 0 0.3em 0.8em; font-size: 85%;" id="wx2">
<tr id="wx3">
<td style="padding-right: 6px; font-size: 90%; line-height: 0.4em;" id="wx4">
<div style="position: relative; height: 18px; width: 18px; overflow: hidden;" id="wx5">
<div style="position: absolute; top: 0; left: 0; font-size: 100px; height: 18px; width: 18px; overflow: hidden; line-height: 100px; z-index: 3;" id="wx6"><a href="/wnl/Portaal:Portalenoverzicht" class="new" title="Portaal:Portalenoverzicht" wx:linktype="unknown" wx:pagename="Portaal:Portalenoverzicht" id="wx7">___</a></div>

<div style="position: absolute; top: 0; left: 0; z-index: 2;" id="wx8"><a href="/wnl/Afbeelding:Portal.svg" title="Portaal:Portalenoverzicht" wx:linktype="image" wx:pagename="Afbeelding:Portal.svg" id="wx9"><img src="/wnl/Afbeelding:Portal.svg" alt="Portaal:Portalenoverzicht" width="18" id="wx10"/></a></div>
</div>
</td>
<td id="wx11"><a href="/wnl/Portaal:Javaplatform" class="new" title="Portaal:Javaplatform" wx:linktype="unknown" wx:pagename="Portaal:Javaplatform" id="wx12">Portaal Javaplatform</a> </td>
</tr>
</table>

<wx:templateend start="wx_t1"/>
<p id="wx13">De <b id="wx14">Java Native Interface (JNI)</b> is een <a href="/wnl/Application_Programming_Interface" title="Application Programming Interface" wx:linktype="known" wx:pagename="Application_Programming_Interface" wx:page_id="12547" id="wx15">API</a> binnen het <a href="/wnl/Java_%28programmeertaal%29" title="Java (programmeertaal)" wx:linktype="known" wx:pagename="Java_(programmeertaal)" wx:page_id="1470" id="wx16">Java platform</a>. De JNI is een interface tussen <a href="/wnl/Computerprogramma" title="Computerprogramma" wx:linktype="known" wx:pagename="Computerprogramma" wx:page_id="257" id="wx17">programma's</a> geschreven in Java en programma's die opgesteld zijn in de instructietaal van de <a href="/wnl/Hardware" title="Hardware" wx:linktype="known" wx:pagename="Hardware" wx:page_id="11264" id="wx18">hardware</a> waarop ook de <a href="/wnl/Java_Virtual_Machine" title="Java Virtual Machine" wx:linktype="known" wx:pagename="Java_Virtual_Machine" wx:page_id="52851" id="wx19">Java Virtual Machine</a> draait -- zogeheten <i id="wx20">native</i> programma's.</p>

<a id="Technische_uitvoering" name="Technische_uitvoering"/>
<wx:section level="2" title="Technische uitvoering" id="wxsec2"><h2 id="wx21">Technische uitvoering</h2>

<p id="wx22">De JNI definieert een <a href="/wnl/Interface_%28informatica%29" class="new" title="Interface (informatica)" wx:linktype="unknown" wx:pagename="Interface_(informatica)" id="wx23">interface</a> in twee richtingen tussen de JVM en externe code.</p>

<p id="wx24">De eerste richting loopt van binnen de JVM naar code buiten de JVM en weer terug. Dit gebruik van de JNI bestaat eruit dat binnen een (of meer) <a href="/wnl/Klasse_%28informatica%29" title="Klasse (informatica)" wx:linktype="known" wx:pagename="Klasse_(informatica)" wx:page_id="158132" id="wx25">klasse</a>(n) een of meer <a href="/wnl/Methode" title="Methode" wx:linktype="known" wx:pagename="Methode" wx:page_id="352555" id="wx26">methodes</a> gedefinieerd worden die als <b id="wx27">native</b> gemarkeerd worden. Een native methode binnen de JVM is impliciet abstract -- er is geen implementatie van in de JVM. Ter vervanging daarvan wordt een implementatie gegeven in een native programma dat gecompileerd wordt tot een <a href="/wnl/Dynamische_bibliotheek" class="new" title="Dynamische bibliotheek" wx:linktype="unknown" wx:pagename="Dynamische_bibliotheek" id="wx28">dynamische bibliotheek</a> voor het hardwareplatform onder de JVM. Deze bibliotheek wordt in het geheugen geladen door de JVM, op aangave van het programma dat de bibliotheek wenst te gebruiken. Het programma geeft dit aan de JVM aan door middel van een speciale opdracht (<i id="wx29">java.lang.Runtime.loadLibrary()</i>), gegeven binnen een statisch blok en dus uitgevoerd op het moment dat de betreffende klasse ingeladen wordt.</p>

<p id="wx30">De andere richting loopt van binnen een native programma naar de JVM en terug. In dit geval gebruikt het native programma de JNI om een instantie van de JVM in te laden en te starten en vervolgens die JVM-instantie om een Java-programma uit te voeren.</p>

<p id="wx31">In beide gevallen voorziet de JNI in een brug tussen de JVM en native programma's die het mogelijk maakt om wederzijdse code uit te laten voeren. Deze brug bestaat vooral uit methodes om een klasse of methode in de geheugenruimte van de JVM aan te spreken en code uit te laten voeren, maar ook uit een mapping tussen de primitieve types die gedefinieerd zijn binnen de JVM en de primitieve types die bestaan in de <a href="/wnl/Programmeertaal" title="Programmeertaal" wx:linktype="known" wx:pagename="Programmeertaal" wx:page_id="1438" id="wx32">programmeertaal</a> waarin het native programma geschreven wordt. Via deze brug kan een native programma code aanroepen binnen de JVM of het resultaat van een berekening aan een JVM leveren. Voor communicatie in de andere richting bedient de JVM de mechanismen van de JNI en de in het Java programma gedefinieerde native methodes worden op dezelfde manier aangesproken als "normale" methodes.</p>

<p id="wx33">Native code wordt normaal gesproken geschreven in een andere programmeertaal dan Java. Voor de zeer populaire talen als <a href="/wnl/Programmeertaal_C" title="Programmeertaal C" wx:linktype="known" wx:pagename="Programmeertaal_C" wx:page_id="191560" id="wx34">C</a> en <a href="/wnl/Programmeertaal_Cplusplus" title="Programmeertaal Cplusplus" wx:linktype="known" wx:pagename="Programmeertaal_Cplusplus" wx:page_id="164930" id="wx35">C++</a> bestaan standaard tools zoals <a href="/wnl/Javah" title="Javah" wx:linktype="known" wx:pagename="Javah" wx:page_id="217452" id="wx36">javah</a> die de programmeur ondersteunen bij het gebruik van de JNI door stukken native code te genereren, waarna alleen nog de eigenlijke implementatie ingevuld moet worden. Het ontbreken van dergelijke tools voor andere talen wil echter niet zeggen dat de JNI exclusief gericht is op de "ondersteunde" talen: iedere taal die native programma's kan genereren en dynamische bibliotheken aan kan spreken, kan gebruikt worden.</p>

<a id="Voor-_en_nadelen" name="Voor-_en_nadelen"/>
</wx:section><wx:section level="2" title="Voor- en nadelen" id="wxsec3"><h2 id="wx37">Voor- en nadelen</h2>

<p id="wx38">De JNI is al sinds het prille begin onderdeel van het Java platform. De JNI is geïntroduceerd om Java programma's toegang te geven tot faciliteiten waar de JVM en bestaande Java klassen geen directe toegang toe bieden.</p>

<p id="wx39">Door middel van de JNI is het mogelijk om de mogelijkheden van een Java programma uit te breiden tot de mogelijkheden van de gehele computer, inclusief bijvoorbeeld toegang tot randapparatuur die niet direct ondersteund wordt door de JVM en de klassenbibliotheek. Ook is het met de JNI mogelijk om een JVM in te bedden in een native programma en gebruik te maken van alle faciliteiten van de Java klassenbibliotheek, of een klein Java programma snel uit te voeren (door een JVM te starten waarin niet alle klassen uit de klassenbibliotheek voorgeladen worden). Ook werd de JNI in de vroege dagen van Java genoemd als de geschikte methode om snelheidskritieke <a href="/wnl/Algoritme" title="Algoritme" wx:linktype="known" wx:pagename="Algoritme" wx:page_id="9" id="wx40">algoritmes</a> te implementeren door gebruik te maken van het snelheidsvoordeel van native programma's op de onderliggende hardware. Dit laatste voordeel is met de komst van Just-In-Time Java <a href="/wnl/Compiler" title="Compiler" wx:linktype="known" wx:pagename="Compiler" wx:page_id="260" id="wx41">compilers</a> echter grotendeels verdwenen; daarnaast is het in veel gevallen ook twijfelachtig of de "traagheid" van Java programma's meer veroorzaakt wordt door de JVM of door gebrekkige kwaliteit van de code van de programmeur.</p>

<p id="wx42">Tegenwoordig wordt de JNI minder en minder gebruikt en wordt het gebruik ervan ook meer en meer afgeraden tenzij het echt niet anders kan. Ontwikkelingen op het vlak van JVMs (de Just-In-Time compilers en HotSpot-compilers) hebben het snelheidsverschil van een lopend Java programma ten opzichte van een gelijk programma in native code grotendeels doen vervagen. Daarentegen betekent het gebruik van de JNI wel dat een deel van het programma qua geheugengebruik niet gecontroleerd wordt door de JVM, wat tot geheugenlekken kan leiden. Bovendien is het vrij makkelijk om via native code (zeker wanneer deze geschreven wordt in C of C++) de geheugenruimte van de JVM te vervuilen en zo de hele JVM te laten crashen. Dit is een probleem voor een simpel programma op een simpele JVM, maar een zeer complexe installatie zoals een JVM binnen een <a href="/wnl/Applicatieserver" title="Applicatieserver" wx:linktype="known" wx:pagename="Applicatieserver" wx:page_id="27684" id="wx43">applicatieserver</a> is hier extra gevoelig voor -- een reden dat gebruik van JNI binnen de context van een <a href="/wnl/J2EE" title="J2EE" wx:linktype="known" wx:pagename="J2EE" wx:page_id="27428" id="wx44">J2EE-applicatie</a> volledig uit den boze is.<br id="wx45"/>
Daarnaast bindt het gebruik van de JNI een Java programma niet alleen aan de JVM (de natuurlijke omgeving van een Java programma) maar ook aan de onderliggende hardware en vaak ook aan het <a href="/wnl/Besturingssysteem" title="Besturingssysteem" wx:linktype="known" wx:pagename="Besturingssysteem" wx:page_id="167" id="wx46">besturingssysteem</a>. Dit betekent dat een Java programma opeens niet meer zonder meer overdraagbaar is van JVM op JVM. Het kan ook betekenen dat een Java programma een update van het besturingssysteem op dezelfde hardware niet overleeft, als daarbij het formaat van de dynamische bibliotheken wijzigt.</p>

<p id="wx47">De bovenstaande nadelen, plus het feit dat gangbare hardware meer en meer direct toegankelijk is voor Java programma's via de JVM, hebben ervoor gezorgd dat de JNI recentelijk minder en minder gebruikt wordt. De twee gebieden waar de JNI tegenwoordig voornamelijk wordt toegepast zijn ontwikkeling van specifieke software voor een specifieke doelgroep op een specifieke machine met bijzondere hardware-eisen (zoals ongewone hardware) en in <a href="/wnl/Interpreter" title="Interpreter" wx:linktype="known" wx:pagename="Interpreter" wx:page_id="40752" id="wx48">interpreters</a> voor scripttalen die het mogelijk willen maken om Java klassen te gebruiken in scripts. Voor deze laatste categorie wordt gewerkt aan een uitbreiding van het Java platform om de interactie tussen de JVM en interpreters te verbeteren, de zogeheten <a href="/wnl/Java_Community_Process" title="Java Community Process" wx:linktype="known" wx:pagename="Java_Community_Process" wx:page_id="899129" id="wx49">JSR-223</a>.</p>

<wx:template id="wx_t2" pagename="Sjabloon:Bronnen" page_id="641428"/>
<div style="position:absolute; visibility:hidden; height:0; margin-top:1em;" id="wx50"><a id="Bronnen.2C_noten_en.2Fof_referenties" name="Bronnen.2C_noten_en.2Fof_referenties"/>
<wx:section level="2" title="Bronnen, noten en/of referenties" id="wxsec4"><h2 id="wx51">Bronnen, noten en/of referenties</h2>
</wx:section></div>

<table class="toccolours" style="font-size:85%; margin-top:1em; margin-bottom:-0.5em; border: 1px solid #aaa; padding: 5px; clear: both;" width="100%" id="wx52">
<tr id="wx53">
<td id="wx54"><b id="wx55">Bronnen, noten en/of referenties:</b> </td>
</tr>

<tr id="wx56">
<td id="wx57">
<ul id="wx58">
<li id="wx59"><a href="http://java.sun.com/docs/books/jni/" class="external text" wx:linktype="external" rel="nofollow" id="wx60">Java Native Interface: Programmer's Guide and Specification</a>
<p id="wx61">, een online-publicatie van <a href="/wnl/Sun_Microsystems" title="Sun Microsystems" wx:linktype="known" wx:pagename="Sun_Microsystems" wx:page_id="27315" id="wx62">Sun Microsystems</a></p>
</li>
</ul>
</td>
</tr>
</table>

<wx:templateend start="wx_t2"/>
</wx:section></wx:section></div>
<div id="wx_categorylinks">
<a href="/wnl/index.php?title=Speciaal:Categories&amp;article=Java_Native_Interface" title="Speciaal:Categories" wx:linktype="known" wx:pagename="Speciaal:Categories" id="wx63">Categorie</a>: <span dir="ltr" id="wx64"><a href="/wnl/Categorie:Java_%28programmeertaal%29" title="Categorie:Java (programmeertaal)" wx:linktype="known" wx:pagename="Categorie:Java_(programmeertaal)" wx:page_id="988687" id="wx65">Java (programmeertaal)</a></span></div>
<div id="wx_languagelinks">
in andere talen: <a href="http://de.wikipedia.org/wiki/Java_Native_Interface" class="external" wx:linktype="interwiki" wx:pagename="de:Java_Native_Interface" id="wx66">Deutsch</a> | <a href="http://en.wikipedia.org/wiki/Java_Native_Interface" class="external" wx:linktype="interwiki" wx:pagename="en:Java_Native_Interface" id="wx67">English</a> | <a href="http://es.wikipedia.org/wiki/Java_Native_Interface" class="external" wx:linktype="interwiki" wx:pagename="es:Java_Native_Interface" id="wx68">Español</a> | <a href="http://fr.wikipedia.org/wiki/Java_Native_Interface" class="external" wx:linktype="interwiki" wx:pagename="fr:Java_Native_Interface" id="wx69">Français</a> | <a href="http://it.wikipedia.org/wiki/Java_Native_Interface" class="external" wx:linktype="interwiki" wx:pagename="it:Java_Native_Interface" id="wx70">Italiano</a> | <a href="http://ja.wikipedia.org/wiki/Java_Native_Interface" class="external" wx:linktype="interwiki" wx:pagename="ja:Java_Native_Interface" id="wx71">日本語</a> | <a href="http://pl.wikipedia.org/wiki/Java_Native_Interface" class="external" wx:linktype="interwiki" wx:pagename="pl:Java_Native_Interface" id="wx72">Polski</a> | <a href="http://pt.wikipedia.org/wiki/JNI" class="external" wx:linktype="interwiki" wx:pagename="pt:JNI" id="wx73">Português</a> | <a href="http://ru.wikipedia.org/wiki/Java_Native_Interface" class="external" wx:linktype="interwiki" wx:pagename="ru:Java_Native_Interface" id="wx74">Русский</a></div>
</body>
<wx:templatearguments for="wx_t1"><wx:argument name="1">
<p id="wx75">Javaplatform</p>
</wx:argument></wx:templatearguments>
<wx:templatearguments for="wx_t2"><wx:argument name="bronvermelding">
<p id="wx76">*<a href="http://java.sun.com/docs/books/jni/" class="external text" wx:linktype="external" rel="nofollow" id="wx77">Java Native Interface: Programmer's Guide and Specification</a>, een online-publicatie van <a href="/wnl/Sun_Microsystems" title="Sun Microsystems" wx:linktype="known" wx:pagename="Sun_Microsystems" wx:page_id="27315" id="wx78">Sun Microsystems</a></p>
</wx:argument></wx:templatearguments>
</html>
