Pourquoi FFM plutôt que JNI
Interopérabilité native plus sûre
Pourquoi FFM plutôt que JNI est une leçon Java Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Java Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Java Academy comprend 4 leçons au total.
Appeler du code natif
Java doit parfois appeler des bibliothèques C ou travailler avec de la mémoire hors tas. La méthode classique était l’interface native Java (JNI). La méthode moderne est l’API des fonctions étrangères et de la mémoire (FFM), finalisée dans Java 22 (JEP 454).
Cette leçon explique pourquoi FFM constitue un meilleur choix.
Ce qu’exigeait JNI
JNI était pénible :
- Écrire du code de liaison C avec des signatures
JNIEXPORTpeu pratiques - Compiler une bibliothèque native partagée pour chaque plateforme
- Convertir manuellement les types Java et C
- Une erreur suffit à faire planter la JVM
FFM est entièrement en Java
FFM permet d’appeler des fonctions natives et d’accéder à la mémoire native entièrement depuis Java. Aucun code de liaison C, aucune étape de compilation distincte, aucune conversion manuelle des données.
Vous décrivez la signature de la fonction native en Java et l’invoquez via une référence de méthode.
Les paquets principaux
Tout se trouve dans java.lang.foreign. Les principaux types sont :
LinkeretSymbolLookuppour rechercher et lier les fonctionsMemorySegmentpour la mémoire nativeArenapour une durée de vie déterministeMemoryLayoutetFunctionDescriptorpour décrire les structures
Une sécurité intégrée dès la conception
FFM est bien plus sûr que JNI :
- Accès à la mémoire vérifié par rapport aux limites
- Durée de vie liée à une
Arena, de sorte que toute utilisation après libération est détectée - Le confinement empêche les accès inter-threads non sûrs
Les erreurs provoquent des exceptions Java au lieu de faire planter la VM.
Aperçu de l’API
Cette esquisse recherche la fonction C strlen et prépare un descripteur vers celle-ci. L’idée est que tout cela n’est que du code Java ordinaire.
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);
}
}Performances
Les appels descendants de FFM offrent des performances comparables à celles de JNI, voire supérieures, car le compilateur à la volée peut intégrer et optimiser les fragments générés. Il n’y a pas de passerelle C à franchir à chaque appel.
Activer l’accès natif
Comme le code natif peut être dangereux, FFM peut émettre un avertissement ou exiger une activation explicite. Vous accordez l’accès au lancement avec --enable-native-access=ALL-UNNAMED (ou avec un nom de module précis) afin de supprimer les avertissements.
Remplacer sun.misc.Unsafe
FFM (avec l’API de mémoire) est également le remplacement officiellement recommandé des opérations hors tas de sun.misc.Unsafe, depuis longtemps déconseillées. Les bibliothèques qui géraient manuellement des tampons natifs peuvent migrer vers des interfaces de programmation sûres et prises en charge.
Outils : jextract
Pour les grandes bibliothèques C, l’outil compagnon jextract lit un fichier d’en-tête C et génère automatiquement les liaisons FFM pour Java. Vous évitez d’écrire les descriptions à la main.
C’est le pendant de FFM en matière de productivité, tout comme un générateur de code.
Quand utiliser FFM
Utilisez FFM lorsque vous devez :
- Appeler une bibliothèque C/C++ existante
- Interagir avec le système d’exploitation à bas niveau
- Gérer efficacement de grands tampons hors tas
Pour du code Java pur, vous n’en avez jamais besoin.
Vérification rapide
Rappelez-vous l’avantage clé par rapport à JNI.
Récapitulatif
Vous avez appris pourquoi FFM est meilleur que JNI :
- Java pur, sans code de liaison C ni compilation supplémentaire
- Sûr : vérification des limites, durées de vie des Arena, confinement
- Performances comparables ou supérieures
- Remplace
sun.misc.Unsafeet s’utilise avecjextract
Ensuite : gérer la mémoire native avec MemorySegment et Arena.
Questions Fréquemment Posées
La leçon « Pourquoi FFM plutôt que JNI » est-elle gratuite ?
Oui — le texte complet de « Pourquoi FFM plutôt que JNI » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Java Academy, passe à CoddyKit PRO. Le cours Java Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Pourquoi FFM plutôt que JNI » ?
Interopérabilité native plus sûre Tu pratiques Java Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Java Academy ?
Aucune expérience préalable n'est requise. Java Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.
Combien de temps prend la leçon « Pourquoi FFM plutôt que JNI » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Java Academy ?
Oui. Chaque leçon Java Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Pourquoi FFM plutôt que JNI
- MemorySegment et Arena
- Handles d’appels descendants
- Dispositions et structures