Java Academy · Oppitunti

Miksi FFM eikä JNI

Turvallisempi natiivien toimintojen käyttö.

Oppitunti 1/413 vaihetta

Miksi FFM eikä JNI on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.

Natiivikoodin kutsuminen

Java tarvitsee toisinaan kutsua C-kirjastoja tai käsitellä keon ulkopuolista muistia. Perinteinen tapa oli Java Native Interface (JNI). Moderni tapa on Foreign Function and Memory API (FFM), joka vakiinnutettiin Java 22:ssa (JEP 454).

Tässä oppitunnissa selitetään, miksi FFM on parempi valinta.

Mitä JNI edellytti

JNI oli hankala:

  • Kirjoitetaan C-liitoskoodia hankaline JNIEXPORT-allekirjoituksineen
  • Käännetään alustakohtainen natiivijaettu kirjasto
  • Muunnetaan Java- ja C-tyyppien välillä manuaalisesti
  • Virhe voi helposti kaataa JVM:n

FFM on puhdasta Javaa

FFM:n avulla natiivifunktioita voi kutsua ja natiivimuistia käyttää kokonaan Javasta. C-liitoskoodia, erillistä käännösvaihetta tai itse kirjoitettua marshalling-koodia ei tarvita.

Natiivifunktion allekirjoitus kuvataan Javassa ja funktio kutsutaan metodikahvan avulla.

Keskeiset paketit

Kaikki sijaitsee paketissa java.lang.foreign. Keskeiset tyypit ovat:

  • Linker ja SymbolLookup funktioiden etsimiseen ja sitomiseen
  • MemorySegment natiivimuistia varten
  • Arena determinististä elinkaarta varten
  • MemoryLayout ja FunctionDescriptor rakenteiden kuvaamiseen

Turvallisempi suunnittelun ansiosta

FFM on paljon turvallisempi kuin JNI:

  • Muistinkäytön rajat tarkistetaan
  • Elinkaari sidotaan Arena-alueeseen, joten vapautetun muistin käyttö havaitaan
  • Eristäminen estää vaarallisen käytön säikeiden välillä

Virheistä seuraa Java-poikkeus virtuaalikoneen kaatumisen sijaan.

Kurkistus APIin

Tässä esimerkissä etsitään C:n strlen-funktio ja valmistellaan siihen kahva. Olennaista on, että kyse on kokonaan tavallisesta Java-koodista.

import java.lang.foreign.*;
import java.lang.invoke.MethodHandle;

public class Main {
    public static void main(String[] args) {
        Linker linker = Linker.nativeLinker();
        SymbolLookup stdlib = linker.defaultLookup();
        MethodHandle strlen = linker.downcallHandle(
            stdlib.find("strlen").orElseThrow(),
            FunctionDescriptor.of(ValueLayout.JAVA_LONG, ValueLayout.ADDRESS));
        System.out.println("Bound a handle to strlen: " + strlen);
    }
}

Suorituskyky

FFM:n downcall-kutsut ovat JNI:n kanssa kilpailukykyisiä ja usein nopeampia, koska JIT voi sijoittaa luodut stubit suoraan koodiin ja optimoida niitä. Jokaisella kutsulla ei tarvitse ylittää erillistä C-trampoliinia.

Natiivikäytön salliminen

Koska natiivikoodi voi olla vaarallista, FFM voi antaa varoituksen tai edellyttää käytön sallimista. Käynnistyksen yhteydessä käyttö sallitaan parametrilla --enable-native-access=ALL-UNNAMED (tai tietyn moduulin nimellä), jolloin varoitukset poistuvat.

sun.misc.Unsafen korvaaminen

FFM yhdessä Memory API:n kanssa on myös virallinen korvaaja pitkään vanhentuneille sun.misc.Unsafe-off-heap-operaatioille. Kirjastot, jotka hallitsivat natiivipuskureita itse, voivat siirtyä turvallisiin ja tuettuihin API-rajapintoihin.

Työkalut: jextract

Suurten C-kirjastojen yhteydessä oheistyökalu jextract lukee C-otsikkotiedoston ja luo Java FFM -sidokset automaattisesti. Näin kuvauksia ei tarvitse kirjoittaa käsin.

Se on FFM:n tuottavuutta lisäävä vastine, pitkälti koodigeneraattorin tapaan.

Milloin FFM:ää käytetään

FFM kannattaa ottaa käyttöön, kun täytyy:

  • kutsua olemassa olevaa C/C++-kirjastoa
  • toimia käyttöjärjestelmän kanssa matalalla tasolla
  • hallita suuria off-heap-puskureita tehokkaasti

Pelkkää Javaa käytettäessä sitä ei tarvita koskaan.

Pikatarkistus

Palauttakaa mieleen JNI:hin verrattuna tärkein etu.

Kertaus

Opitte, miksi FFM päihittää JNI:n:

  • Pelkkä Java, ei C-liimakoodia tai ylimääräistä käännösvaihetta
  • Turvallisuus: rajatarkistukset, Arena-alueiden elinkaaret ja eristäminen
  • Kilpailukykyinen tai parempi suorituskyky
  • Korvaa sun.misc.Unsafe-toiminnot ja toimii yhdessä jextract-työkalun kanssa

Seuraavaksi: natiivimuistin hallinta MemorySegment- ja Arena-tyypeillä.

Aloita maksutta

Opi Java tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
104
Oppitunnit
374

Usein kysytyt kysymykset

Onko oppitunti ”Miksi FFM eikä JNI” ilmainen?

Kyllä – oppitunnin ”Miksi FFM eikä JNI” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Miksi FFM eikä JNI”?

Turvallisempi natiivien toimintojen käyttö. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Miksi FFM eikä JNI”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?

Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Miksi FFM eikä JNI
  2. MemorySegment ja Arena
  3. Downcall-kahvat
  4. Asettelu ja rakenteet
← Takaisin: Java Academy