b'\n_START_ARTICLE_\nJava Native Interface\n_START_PARAGRAPH_\nJava Native Interface (JNI) on tarkvararaamistik, mis v\xc3\xb5imaldab Java virtuaalmasinas (JVM) jooksval Java programmil kutsuda v\xc3\xa4lja operatsioonis\xc3\xbcsteemi ja riistvaraspetsiifilisi rakendusi ning teeke, mis on kirjutatud teistes programmeerimiskeeltes, n\xc3\xa4iteks C, C++ ja Assembler.\n_START_SECTION_\nEesm\xc3\xa4rgid\n_START_PARAGRAPH_\nJNI v\xc3\xb5imaldab programmeerijal lahendada olukorda, kus tarkvara kirjutamine t\xc3\xa4ielikult Javas ei ole v\xc3\xb5imalik, n\xc3\xa4iteks kui Java standardteek ei toeta platvormispetsiifilist funktsionaalsust v\xc3\xb5i teeki. Samuti aitab JNI taaskasutada varem m\xc3\xb5nes muus programmeerimiskeeles kirjutatud teeki. JNI annab programmeerijale ligip\xc3\xa4\xc3\xa4su s\xc3\xbcsteemi madalatasemelistele ressurssidele, n\xc3\xa4iteks m\xc3\xa4lu ja I/O operatsioonidele, mis teevad programmi kirjutamise keerulisemaks, aga samas ka paindlikumaks._NEWLINE_\xc3\x9cldiselt soovitatakse JNI kasutamist v\xc3\xb5imalikult palju v\xc3\xa4ltida, kuna v\xc3\xa4liste masinkoodiks kompileeritud teekide kasutamisega muutub rakendus platvormist s\xc3\xb5ltuvaks. Selle probleemi lahendamiseks tuleb iga platvormi jaoks kompileerida eraldi teek ning siis lasta Java koodil k\xc3\xa4ivitamise ajal tuvastada kasutaja operatsioonis\xc3\xbcsteem ja selle p\xc3\xb5hjal laadida \xc3\xb5ige teek.\n_START_SECTION_\nKasutamine\n_START_PARAGRAPH_\nSelleks, et defineerida s\xc3\xbcsteemispetsiifilist (ingl native) funktsiooni, tuleb definitsioonis kasutada v\xc3\xb5tmes\xc3\xb5na native. See annab Java kompilaatorile teada, et funktsioon on implementeeritud eraldiseisvas .so/.dll/.dylib (s\xc3\xb5ltuvalt operatsioonis\xc3\xbcsteemist) failis, mitte ei ole osa Javas kirjutatud koodist._NEWLINE_public class JniTest {_NEWLINE__NEWLINE_    private static native int square(int x);_NEWLINE__NEWLINE_    public static void main(String[] args) {_NEWLINE_        System.loadLibrary("jniTest");_NEWLINE_        System.out.println(square(20));_NEWLINE_    }}_NEWLINE_N\xc3\xbc\xc3\xbcd sisestame k\xc3\xa4sureal javac -h . JniTest.java , mis genereerib automaatselt selle klassi p\xc3\xb5hjal meile j\xc3\xa4rgneva p\xc3\xa4ise faili nimega JniTest.h_NEWLINE_/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class JniTest */#ifndef _Included_JniTest#define _Included_JniTest#ifdef __cplusplusextern "C" {#endif/* * Class:     JniTest * Method:    square * Signature: (I)I */JNIEXPORT jint JNICALL Java_JniTest_square_NEWLINE_  (JNIEnv *, jclass, jint);#ifdef __cplusplus}#endif#endif_NEWLINE_Implementatsiooni kirjutame faili JniTest.cpp, mis v\xc3\xb5iks v\xc3\xa4lja n\xc3\xa4ha umbes nii:_NEWLINE_#include "JniTest.h"JNIEXPORT jint JNICALL Java_JniTest_square(JNIEnv *env, jclass thisOpj, jint x) {_NEWLINE_    return x * x;}_NEWLINE_J\xc3\xa4rgmiseks sammuks on C keeles kirjutatud koodi kompileerimine Windowsil k\xc3\xa4suga g++ -c -I%JAVA_HOME%\\include -I%JAVA_HOME%\\include\\win32 JniTest.cpp -o JniTest.o. Viimaseks sammuks on kompileerimisel tekkinud objektifaili linkimine Windowsil k\xc3\xa4suga g++ -shared -o jniTest.dll JniTest.o -Wl,--add-stdcall-alias. Selle tulemusel tekib jniTest.dll fail, mis laetakse Java programmis funktsiooniga System.loadLibrary("jniTest"). Programmi k\xc3\xa4ivitamiseks tuleb m\xc3\xa4\xc3\xa4rata JVM parameeter java.library.path, mille v\xc3\xa4\xc3\xa4rtuseks peab m\xc3\xa4\xc3\xa4rama .dll faili asukoha.'