Miksi FFM eikä JNI
Turvallisempi natiivien toimintojen käyttö.
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:
LinkerjaSymbolLookupfunktioiden etsimiseen ja sitomiseenMemorySegmentnatiivimuistia vartenArenadeterminististä elinkaarta vartenMemoryLayoutjaFunctionDescriptorrakenteiden 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ä.
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
- Miksi FFM eikä JNI
- MemorySegment ja Arena
- Downcall-kahvat
- Asettelu ja rakenteet