Panoramica di JNI

Dal punto di vista di un JVM, esistono due tipi di codice: "Java™" e "nativo". JNI (Java Native Interface) stabilisce un'interfaccia ben definita e indipendente dalla piattaforma tra le due.

Il codice nativo può essere utilizzato insieme a Java in due modi distinti: come "metodi nativi" in una JVM in esecuzione e come codice che crea una JVM utilizzando l'"API di richiamo". Questa sezione descrive la differenza.

Metodi nativi

I metodi nativi Java vengono dichiarati in Java, implementati in un altro linguaggio (come C o C + +) e caricati dalla JVM come necessario. Per utilizzare i metodi nativi, è necessario:

  1. Dichiarare il metodo nativo nel codice Java.

    Quando il compilatore javac rileva una dichiarazione del metodo nativo nel codice di origine Java, registra il nome e i parametri del metodo. Poiché il codice sorgente Java non contiene implementazione, il compilatore contrassegna il metodo come "nativo". La JVM può risolvere il metodo correttamente quando viene richiamato.

  2. Implementare il metodo nativo.

    I metodi nativi sono implementati come punti di ingresso esterni in una libreria binaria caricabile. Il contenuto di una libreria nativo è specifico della piattaforma. JNI fornisce un modo per la JVM di utilizzare i metodi nativi in modo indipendente dalla piattaforma.

    La JVM esegue chiamate ai metodi nativi. Quando la JVM si trova in un metodo nativo, JNI fornisce un modo per "richiamare" la JVM.

  3. Carica il codice del metodo nativo per la VM da utilizzare.

    Oltre a dichiarare il metodo nativo, è necessario trovare e caricare la libreria nativa che contiene il metodo al runtime.

    Due interfacce Java caricano le librerie native:

    • java.lang.System.load()
    • java.lang.System.loadLibrary()

    Generalmente, una classe che dichiara i metodi nativi carica la libreria nativa nel relativo inizializzatore statico.

API di richiamo

La creazione di un JVM implica il codice nativo. L'aspetto del JNI utilizzato per questo scopo è denominato API di richiamo JNI. Per utilizzare l'API di richiamo, è necessario eseguire il bind a una libreria condivisa specifica dell'implementazione, in modo statico o dinamico, e richiamare le funzioni JNI_ * che esporta.

La specifica e l'implementazione JNI

La specifica JNI è vaga sui dettagli di implementazione selezionati. Fornisce un framework riutilizzabile per interfacce C e C++ semplici ed estensibili. Il modello JNI è anche la base per la specifica JVMTI.

La specifica del marchio Oracle Corporation e JCK (Java Compatibility Kit) garantiscono la conformità alla specifica ma non all'implementazione. Il codice nativo deve essere conforme alla specifica e non all'implementazione. Il codice scritto rispetto a un comportamento non specificato è soggetto a problemi di portabilità e compatibilità di inoltro.