Waarom FFM boven JNI
Veiligere native interop
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:
LinkerenSymbolLookupom functies te vinden en te bindenMemorySegmentvoor systeemeigen geheugenArenavoor een voorspelbare levensduurMemoryLayoutenFunctionDescriptorom 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.Unsafeen werkt samen metjextract
Volgende: native geheugen beheren met MemorySegment en Arena.
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
- Waarom FFM boven JNI
- MemorySegment en Arena
- Downcall-handles
- Layouts en structs