Indledning om native nøgleord:
Det native nøgleord fungerer som en forbindelse mellem JAVA-sproget og en del af koden eller biblioteket, der er skrevet på andre sprog end JAVA, som måske afhænger af den maskine, du arbejder på. Hvis nøgleordet native anvendes til en metode, betyder det, at metoden vil blive implementeret ved hjælp af native kode skrevet i et andet sprog (som C eller C++) via JNI (JAVA native interface).
Syntaks:
Syntaksen for native kode er den samme som normal funktionsdefinition med nøgleordet “native” tilføjet i starten af funktionen.
For eksempel:
Public class testing
{public native String testMethod (String parameter);}
Her er public en adgangsmodifikator. Den skal være public, så en anden fil kan bruge den. String er den returnerede datatype for funktionen. Det kan være et heltal, et tegn eller en boolsk værdi afhængigt af nøgleordet. Den parameter, der overføres til denne funktion, er også af datatype string. Alt skal holdes under class.
Efter funktionsdeklaration kalder vi denne funktion via objekt oprettet og bibliotek indlæst.
public static void main(String args)
{
System.loadLibrary(“testing”);
testing testingnew = new testing();
String output = testingnew.stringMethod(“NATIVE”);
}
Det ovenfor definerede bibliotek skal først indlæses, og n dets objekt oprettes. Ved hjælp af dette objekt kaldes den native funktion.
Hvordan fungerer det native nøgleord?
Der skal være to filer. Den ene skal indeholde JAVA-kode, mens den anden skal indeholde C/C++ legacy-kode. Java-koden vil blive brugt til at kalde den ældre kode. Denne legacy-kode vil interagere med hardware og returnere det forventede output.
Når legacy-koden interagerer med hardware, vil den ikke følge de retningslinjer, der er fastlagt af JAVA. Denne kode vil foretage den ønskede behandling for at få output og videregive resultaterne til JNI. Java native interface vil derefter kontrollere i sin mappe, der indeholder alle de regler, der vedrører native kode (dette kommer under filen javah.exe i SDK). JNI er udviklet som en del af Java-værktøjssættet. Efter denne behandling vil JAVA offentliggøre resultaterne i selve JAVA-sproget. Når vi opretter et program i JAVA, skal vi sørge for, at der er en variabel/datastrømsforbindelse mellem JAVA-filen og legacy-filen, så der er en smidig datastrøm mellem dem begge.
Strækninger, der forklarer, hvordan man gør brug af native nøgleord, er angivet nedenfor:
- Skriv JAVA-koden, der indeholder native metode, shared library loaded, og gem den ved hjælp af “filnavn.JAVA”.
- Kompilér JAVA-koden og konverter koden til bytekode.
- Opret C/C++ header-fil, der indeholder signatur for den native funktion, der skal kaldes.
- Skriv C/C++-kode med implementering af native metode.
- Kør JAVA eksekverbar fil for at se resultaterne.
Eksempler til at vise implementering af native nøgleord:
Vi skal skrive kode i Eclipse og køre koden for at oprette et bibliotek, som derefter C-kode vil blive implementeret ved hjælp af.
Kode: pakke com.slackerOne;
public class JPP {
public static native void pAccess();
public static native int pRead();
public static native void pWrite(int port, int output);
static{
System.loadLibrary(“JPPlibs”);
}
public void jAccess(){
JPP.pAccess();
}
public int jRead(){
return JPP.pRead();
}
public void jWrite(int port, int output){
JPP.pWrite(port, output);
}
}
}
Efter at have gemt denne kode i ny “klasse” i java-projektet. Vi skal opsætte kørselsmiljøet for at generere headerfilen.
![](https://miro.medium.com/max/60/1*yaLOSXveYEmKvNx89oAyuw.png?q=20)
Når vi vil køre dette, bør vi få et bibliotek genereret.
Output:
Her har vi oprettet headerfilen fra java-koden, som vil fungere som link mellem den native kode og java-sproget.
![](https://miro.medium.com/max/60/1*NMVw1c0VLGOm2dxSp-ih8g.png?q=20)
Fordele:
- Det giver en ekstra fordel for JAVA at interagere med kode skrevet i andre sprog og reducerer arbejdet med at have den samme kode skrevet i JAVA, hvilket reducerer redundans i koden.
- Det forbedrer den samlede kodeydelse. Da den kode, der er skrevet på andre sprog, måske er hurtigere, når den arbejder med maskinsprog i forhold til JAVA. Vi kan derefter bruge JAVA-programmet til at kalde denne kode.
- Med denne fremgangsmåde kan vi give direkte systemkald. Det reducerer sandsynligheden for ekstern indblanding og forbedrer hastigheden af kodeudførelsen.
- Du kan dynamisk kalde et forudindlæst bibliotek (skrevet i et andet sprog end JAVA) ved hjælp af en vilkårlig kørekode skrevet i JAVA og stadig få svar i JAVA.
- Gør det tilgængeligt for JAVA at nå de hardwareressourcer, som kun andre sprog har adgang til at bruge.
- Hvis du allerede har en platformsafhængig kode opbygget til din applikation, og hvis funktioner ikke understøttes via JAVA, kan vi i så fald have native kode og knytte denne native kode til JAVA via native nøgleord.
Regler:
- Native nøgleord skal bruges før metode-navnet.
- Deklaration af native metoder har ikke body og bør slutte med semikolon, da disse metoder ikke er defineret i JAVA, men findes i C/C++-sprog.
- Native metoder kan ikke deklareres som abstrakte metoder.
- Da der ikke er nogen sikkerhed for, om den tidligere gamle kode er skrevet i overensstemmelse med IEEE 754-standarden (IEEE Standard for Floating-Point Arithmetic er en teknisk standard for floating-point aritmetik, der blev fastlagt i 1985 af Institute of Electrical and Electronics Engineers), kan vi ikke deklarere disse native metoder som strictftp.
- Specifikationen Java Native Interface (JNI) er designet af JAVA til at definere regler og deklarationer til implementering af native metoder, som f.eks. konvertering af datatyper mellem Java og den native kode.
Slutning:
Native nøgleord er, som bygger bro mellem native sprog og JAVA. Dette kan bruges som et kritisk led, hvis vores softwares interaktion med hardware er mere for at få den effektive kode ved hjælp af allerede eksisterende kode. Det gør implementeringsarbejdet mindre i forhold til at designe en ny applikationskode fra bunden, hvor det kan undgås.