Java Academy · leksjon

Hvorfor FFM fremfor JNI

Sikrere samhandling med native-kode

Leksjon 1 av 413 trinn

Hvorfor FFM fremfor JNI er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.

Kall av native-kode

Java må noen ganger kalle C-biblioteker eller arbeide med minne utenfor heapen. Den klassiske metoden var Java Native Interface (JNI). Den moderne metoden er Foreign Function and Memory API (FFM), som ble ferdigstilt i Java 22 (JEP 454).

Denne leksjonen forklarer hvorfor FFM er det bedre valget.

Hva JNI krevde

JNI var omstendelig:

  • Skriv limkode i C med tungvinte JNIEXPORT-signaturer
  • Kompiler et eget dynamisk bibliotek for hver plattform
  • Konverter manuelt mellom Java- og C-typer
  • Det er lett å krasje JVM-en ved en feil

FFM er ren Java

FFM gjør det mulig å kalle native-funksjoner og få tilgang til native-minne utelukkende fra Java. Ingen limkode i C, ingen separat kompilering og ingen håndskrevet marshalling.

Beskriv signaturen til native-funksjonen i Java, og kall den via et method handle.

De viktigste pakkene

Alt ligger i java.lang.foreign. De sentrale typene er:

  • Linker og SymbolLookup for å finne og binde funksjoner
  • MemorySegment for native-minne
  • Arena for deterministisk levetid
  • MemoryLayout og FunctionDescriptor for å beskrive strukturer

Sikrere fra grunnen av

FFM er langt sikrere enn JNI:

  • Bounds-kontrollert minnetilgang
  • Levetiden er knyttet til en Arena, slik at bruk etter frigjøring oppdages
  • Begrensning hindrer usikker tilgang på tvers av tråder

Feil utløser Java-unntak i stedet for å krasje VM-en.

En smakebit på API-et

Denne skissen finner C-funksjonen strlen og klargjør et håndtak til den. Poenget er at dette bare er vanlig Java-kode.

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);
    }
}

Ytelse

FFM-downcalls kan måle seg med JNI og er ofte raskere, fordi JIT-kompilatoren kan inline og optimalisere de genererte stubene. Det finnes ingen C-trampoline som må krysses for hvert kall.

Aktivere native-tilgang

Fordi nativekode kan være farlig, kan FFM vise en advarsel eller kreve at tilgangen aktiveres eksplisitt. De gir tilgang ved oppstart med --enable-native-access=ALL-UNNAMED (eller et spesifikt modulnavn) for å undertrykke advarslene.

Erstatte sun.misc.Unsafe

FFM (sammen med Memory API) er også den anbefalte erstatningen for de lenge utdaterte sun.misc.Unsafe-operasjonene for minne utenfor heapen. Biblioteker som tidligere håndterte native buffere manuelt, kan migrere til sikre og støttede API-er.

Verktøy: jextract

For store C-biblioteker leser det tilhørende verktøyet jextract en C-headerfil og genererer automatisk Java-bindingene for FFM. De slipper å skrive beskrivelser manuelt.

Det er produktivitetsmotstykket til FFM, omtrent som en kodegenerator.

Når FFM bør brukes

Bruk FFM når De må:

  • Kalle et eksisterende C/C++-bibliotek
  • Samhandle med operativsystemet på lavt nivå
  • Håndtere store buffere utenfor heapen effektivt

For arbeid som utelukkende bruker Java, trenger De det aldri.

Kort kontroll

Husk hovedfordelen fremfor JNI.

Oppsummering

De lærte hvorfor FFM er bedre enn JNI:

  • Ren Java, uten C-lim eller ekstra kompilering
  • Sikkert: bounds-kontroller, Arena-levetider og begrensning
  • Konkurransedyktig eller bedre ytelse
  • Erstatter sun.misc.Unsafe og fungerer sammen med jextract

Deretter: håndtering av native minne med MemorySegment og Arena.

Gratis å komme i gang

Lær deg Java med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
104
Leksjoner
374

Ofte stilte spørsmål

Er leksjonen «Hvorfor FFM fremfor JNI» gratis?

Ja – hele teksten i «Hvorfor FFM fremfor JNI» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Hvorfor FFM fremfor JNI»?

Sikrere samhandling med native-kode Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Java Academy?

Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «Hvorfor FFM fremfor JNI»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?

Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Hvorfor FFM fremfor JNI
  2. MemorySegment og Arena
  3. Downcall handles
  4. Layouts og structs
← Tilbake til Java Academy