Hvorfor FFM frem for JNI
Sikrere native interaktion
Hvorfor FFM frem for JNI er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.
Kald af platformsnær kode
Java har nogle gange brug for at kalde C-biblioteker eller arbejde med hukommelse uden for heap’en. Den klassiske metode var Java Native Interface (JNI). Den moderne metode er Foreign Function and Memory API (FFM), som blev standardiseret i Java 22 (JEP 454).
Denne lektion forklarer, hvorfor FFM er det bedre valg.
Hvad JNI krævede
JNI var besværligt:
- Skriv bindingskode i C med besværlige
JNIEXPORT-signaturer - Kompiler et platformspecifikt delt bibliotek
- Konverter manuelt mellem Java- og C-typer
- Det er let at få JVM’en til at gå ned på grund af en fejl
FFM er ren Java
FFM lader dig kalde platformsnære funktioner og få adgang til platformsnær hukommelse udelukkende fra Java. Ingen C-bindingskode, ingen separat kompilering og ingen håndskrevet typekonvertering.
Du beskriver den platformsnære funktions signatur i Java og kalder den via et metodehåndtag.
De vigtigste pakker
Alt findes i java.lang.foreign. De vigtigste typer er:
LinkerogSymbolLookuptil at finde og binde funktionerMemorySegmenttil platformsnær hukommelseArenatil deterministisk levetidMemoryLayoutogFunctionDescriptortil at beskrive strukturer
Sikkerhed gennem design
FFM er langt sikrere end JNI:
- Grænsekontrolleret hukommelsesadgang
- Levetiden er knyttet til en
Arena, så brug efter frigivelse opdages - Trådafgrænsning forhindrer usikker adgang på tværs af tråde
Fejl udløser Java-undtagelser i stedet for at få VM'en til at gå ned.
En smagsprøve på API'et
Denne skitse finder C-funktionen strlen og forbereder et handle til den. Pointen er, at det hele er almindelig 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);
}
}Ydeevne
FFM-downcalls kan måle sig med JNI og er ofte hurtigere, fordi JIT'en kan indsætte koden direkte og optimere de genererede stubber. Der er ingen C-trampolin, der skal krydses ved hvert kald.
Aktivering af adgang til native-kode
Da native-kode kan være farlig, kan FFM advare eller kræve et aktivt tilvalg. Du giver adgang ved opstart med --enable-native-access=ALL-UNNAMED (eller et specifikt modulnavn) for at fjerne advarsler.
Erstatning for sun.misc.Unsafe
FFM (sammen med Memory API) er også den anbefalede erstatning for de længe forældede sun.misc.Unsafe-operationer til hukommelse uden for heapen. Biblioteker, der håndterede native-buffere manuelt, kan migrere til sikre, understøttede API'er.
Værktøj: jextract
Til store C-biblioteker læser det tilhørende værktøj jextract en C-headerfil og genererer automatisk Java-bindinger til FFM. Du slipper for at skrive deskriptorer i hånden.
Det er FFM's produktivitetsmæssige modstykke, omtrent som en kodegenerator.
Hvornår skal du bruge FFM
Brug FFM, når du skal:
- kalde et eksisterende C/C++-bibliotek
- arbejde sammen med operativsystemet på lavt niveau
- håndtere store buffere uden for heapen effektivt
Til arbejde, der kun bruger Java, får du aldrig brug for det.
Hurtigt tjek
Husk den vigtigste fordel i forhold til JNI.
Opsamling
Du har lært, hvorfor FFM er bedre end JNI:
- Ren Java uden C-lim eller ekstra kompilering
- Sikkert: grænsekontrol, Arena-levetider og trådafgrænsning
- Sammenlignelig eller bedre ydeevne
- Erstatter
sun.misc.Unsafeog fungerer sammen medjextract
Næste emne: håndtering af native hukommelse med MemorySegment og Arena.
Lær Java med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 104
- Lektioner
- 374
Ofte stillede spørgsmål
Er lektionen “Hvorfor FFM frem for JNI” gratis?
Ja — hele teksten til “Hvorfor FFM frem for JNI” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Hvorfor FFM frem for JNI”?
Sikrere native interaktion Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Java Academy?
Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “Hvorfor FFM frem for JNI”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Java Academy-lektion?
Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Hvorfor FFM frem for JNI
- MemorySegment og Arena
- Downcall handles
- Layouts og structs