0Pricing
Java Academy · Leçon

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 JNIEXPORT peu 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 :

  • Linker et SymbolLookup pour rechercher et lier les fonctions
  • MemorySegment pour la mémoire native
  • Arena pour une durée de vie déterministe
  • MemoryLayout et FunctionDescriptor pour 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.Unsafe et s’utilise avec jextract

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

  1. Pourquoi FFM plutôt que JNI
  2. MemorySegment et Arena
  3. Handles d’appels descendants
  4. Dispositions et structures
← Retour à Java Academy