Java Academy · Les

Waarom FFM boven JNI

Veiligere native interop

Les 1 van 413 stappen

Waarom FFM boven JNI is een gratis Java Academy-les op CoddyKit. Dit is les 1 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Java Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Java Academy bevat in totaal 4 lessen.

Systeemeigen code aanroepen

Java moet soms functies in C-bibliotheken aanroepen of met geheugen buiten de heap werken. De klassieke manier was de Java Native Interface (JNI). De moderne manier is de Foreign Function and Memory API (FFM), die in Java 22 is voltooid (JEP 454).

In deze les wordt uitgelegd waarom FFM de betere keuze is.

Wat JNI vereiste

JNI was omslachtig:

  • C-koppelcode schrijven met onhandige JNIEXPORT-signaturen
  • Voor elk platform een systeemeigen gedeelde bibliotheek compileren
  • Java- en C-typen handmatig naar elkaar omzetten
  • Door een fout kan de JVM gemakkelijk crashen

FFM is puur Java

Met FFM kun je systeemeigen functies aanroepen en systeemeigen geheugen benaderen volledig vanuit Java. Geen C-koppelcode, geen aparte compilatiestap en geen handmatig geschreven gegevensomzetting.

Je beschrijft de signatuur van de systeemeigen functie in Java en roept deze aan via een method handle.

De belangrijkste pakketten

Alles staat in java.lang.foreign. De belangrijkste typen zijn:

  • Linker en SymbolLookup om functies te vinden en te binden
  • MemorySegment voor systeemeigen geheugen
  • Arena voor een voorspelbare levensduur
  • MemoryLayout en FunctionDescriptor om structuren te beschrijven

Veiliger door ontwerp

FFM is veel veiliger dan JNI:

  • Geheugentoegang met grenscontroles
  • Levensduur gekoppeld aan een Arena, zodat gebruik-na-vrijgave wordt gedetecteerd
  • Threadisolatie voorkomt onveilige toegang vanuit andere threads

Fouten veroorzaken Java-uitzonderingen in plaats van de VM te laten crashen.

Kennismaking met de API

Dit voorbeeld zoekt de C-functie strlen en maakt er een verwijzing naar. Het belangrijkste is dat dit allemaal gewone Java-code is.

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

Prestaties

FFM-downcalls kunnen zich meten met JNI en zijn vaak sneller, omdat de JIT de gegenereerde tussenlagen kan inlinen en optimaliseren. Er hoeft geen C-tussenlaag per aanroep te worden overbrugd.

Native toegang inschakelen

Omdat native code gevaarlijk kan zijn, kan FFM waarschuwingen geven of expliciete toestemming vereisen. Je verleent bij het starten toegang met --enable-native-access=ALL-UNNAMED (of met een specifieke modulenaam) om waarschuwingen te onderdrukken.

sun.misc.Unsafe vervangen

FFM (met de Memory API) is ook de officiële vervanging voor de al lange tijd verouderde bewerkingen van sun.misc.Unsafe op geheugen buiten de heap. Bibliotheken die native buffers handmatig beheerden, kunnen overstappen op veilige, ondersteunde API's.

Ontwikkelhulpmiddel: jextract

Voor grote C-bibliotheken leest het bijbehorende hulpmiddel jextract een C-headerbestand en genereert het automatisch de Java-FFM-koppelingen. Je hoeft descriptors niet meer handmatig te schrijven.

Het is de productiviteitsvariant van FFM, vergelijkbaar met een codegenerator.

Wanneer gebruik je FFM

Gebruik FFM wanneer je:

  • een bestaande C/C++-bibliotheek moet aanroepen
  • op laag niveau met het besturingssysteem moet samenwerken
  • grote buffers buiten de heap efficiënt moet beheren

Voor werk dat volledig in Java is geschreven, heb je het nooit nodig.

Korte controle

Bedenk wat het belangrijkste voordeel ten opzichte van JNI is.

Samenvatting

Je hebt geleerd waarom FFM beter is dan JNI:

  • Pure Java, zonder C-koppelcode of extra compilatie
  • Veilig: grenscontroles, levensduur van Arena's en threadisolatie
  • Vergelijkbare of betere prestaties
  • Vervangt sun.misc.Unsafe en werkt samen met jextract

Volgende: native geheugen beheren met MemorySegment en Arena.

Gratis beginnen

Leer Java met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
104
Lessen
374

Veelgestelde vragen

Is de les “Waarom FFM boven JNI” gratis?

Ja — de volledige tekst van “Waarom FFM boven JNI” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Java Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Java Academy bevat in totaal 4 lessen.

Wat leer ik in “Waarom FFM boven JNI”?

Veiligere native interop Je oefent met Java Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Java Academy te beginnen?

Ervaring vooraf is niet nodig. Java Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 1 van 4.

Hoe lang duurt de les “Waarom FFM boven JNI”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Java Academy?

Ja. Elke les over Java Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Waarom FFM boven JNI
  2. MemorySegment en Arena
  3. Downcall-handles
  4. Layouts en structs
← Terug naar Java Academy