Esempio di utilizzo di librerie condivise su z/OS
Questo esempio descrive il processo di utilizzo delle librerie condivise native con un'applicazione Java™ su sistemi z/OS.
Informazioni su questa attività
Questa attività mostra come creare un'applicazione Java che carichi e invochi funzioni C all'interno di una libreria condivisa nativa.
Procedura
- Creare un'applicazione di esempio 'Sample.java:
public class Sample { /** * A static class initialization block that is run when this class * is first loaded. Here, try to load the target libSample.so shared library * that implements the printFromNative() method declared later. */ static { try { System.loadLibrary("Sample"); } catch (Throwable e) { throw new RuntimeException(e); } } /** * Prints a message to STDOUT. * The 'native' keyword indicates that this method is implemented in native code, * callable through the Java Native Interface (JNI). */ public static native void printFromNative(); public static void main(String[] args) { // Invoke the native method Sample.printFromNative(); } }Questa applicazione Java dichiara un metodo nativo statico "
Durante il blocco di inizializzazione della classe statica che viene eseguito quando la classe 'Sample.printFromNative()e lo chiama dal metodo "main.Sampleviene caricata per la prima volta, la chiamata 'System.loadLibrary("Sample")carica la libreria nativa di destinazione 'libSample.so.Nota: L'API 'System.loadLibrary(libname)aggiunge il prefisso 'libe il suffisso '.soal nome della libreria fornito. L'SDK cerca la libreria condivisa di destinazione nel percorso della libreria specificato nella variabile d'ambiente 'LIBPATH. Se la libreria condivisa nativa di destinazione è un insieme di dati MVS o se si dispone di un percorso assoluto o di un nome di libreria specifico, utilizzare invece l'API 'System.load(filename). - La parte Java dell'applicazione è completa, quindi è ora possibile compilarla:
javac Sample.java - Utilizzare il comando javac -h per creare un file di intestazione per il codice nativo:
Questo comando genera un file di intestazione C, chiamato 'javac -h . Sample.javaSample.h, con le firme dei metodi JNI appropriate per l'implementazione dell'applicazione nativa. - Crea un file denominato
Sample.c:
Questo file fornisce l'implementazione nativa C del metodo Java#include <stdio.h> #include "Sample.h" JNIEXPORT void JNICALL Java_Sample_printFromNative(JNIEnv * env, jclass cls) { printf( "Printing from native\n" ); }Sample.printFromNative(). - Compila '
Sample.c, lo collega e lo lega in una libreria condivisa 'libSample.so, che può essere caricata e richiamata dinamicamente da un'applicazione Java. È possibile utilizzare il compilatore XL C/C++ o Open XL C/C++.
comando XL C/C++Ad esempio:xlc -q64 -W "l,dll" -W "c,langlvl(extended),float(ieee),dll,exportall" -o libSample.so -I$JAVA_HOME/include -I$JAVA_HOME/include/zos Sample.c $JAVA_HOME/lib/j9vm/libjvm.xdove '
$JAVA_HOMEè il percorso JAVA_HOME dell'installazione di IBM SDK. Il file di intestazione 'jni.h esiste sotto '$JAVA_HOME/include e 'libjvm.x è in '$JAVA_HOME/lib/ 'j9vm.Gli elementi specifici di 'XL C/C++nei comandi di compilazione e collegamento sono i seguenti:Tabella 1. Elementi specifici del comando XL C/C++ Opzione Descrizione xlc Il comando che esegue il compilatore C di XL. -q64 Opzione valida solo per i 64 bit. Indica al compilatore di compilare la libreria condivisa di destinazione per piattaforme AMODE64 . --W "l,dll" L'opzione -Wviene passata alla fase di collegamento del compilatore. Il linker crea un file di libreria condivisa '.so.--W "c,langlvl(esteso), galleggiante(ieee),dll, exportall"L'opzione -Wviene passata alla fase di compilazione del compilatore.langlvl(extended)abilita le estensioni di linguaggio utilizzate dai file di intestazione JNI, comelong long.float(ieee)indica al compilatore di creare istruzioni e numeri a virgola mobile IEEE754 binari, che corrispondono ai tipi primitivifloatedoubledel linguaggio Java.dllindica al compilatore di produrre codice DLL. Il codice DLL può esportare o importare funzioni e variabili esterne.exportallspecifica che le funzioni di chiamata nella libreria condivisa sono richiamabili da programmi esterni.
comando Open XL C/C++Ad esempio:ibm-clang -m64 -fvisibility=default -o libSample.so -I$JAVA_HOME/include -I$JAVA_HOME/include/zos Sample.c $JAVA_HOME/lib/j9vm/libjvm.xdove $JAVA_HOME è il percorso JAVA_HOME dell'installazione di IBM SDK.
Gli elementi specifici di 'Open XL C/C++nei comandi di compilazione e collegamento sono i seguenti:Tabella 2. elementi specifici del comando Open XL C/C++ Opzione Descrizione ibm-clang Il comando che esegue il compilatore C di Open XL. -m64 Indica al compilatore di compilare la libreria condivisa di destinazione per piattaforme AMODE64 . solo a 64 bit. -fvisibility=default Questa opzione esporta tutte le funzioni e le variabili definite esternamente nell'unità di compilazione, in modo che un'applicazione DLL possa utilizzarle. Gli altri elementi condivisi nei comandi di compilazione e collegamento sono i seguenti:Tabella 3. Elementi comuni a XL e Open XL Opzione Descrizione -o libSample.so Il file di output, che è la libreria condivisa che si desidera creare. Il nome (il testo tra ' libe '.so) deve corrispondere al nome fornito alle API Java 'System.load(filename)o 'System.loadLibrary(filename).--I Indica al compilatore di cercare nella directory $JAVA_HOME /include, oltre alle directory predefinite, i file di intestazione (in questo caso, i file di intestazione JNI). Cambiare $JAVA_HOME con il percorso JAVA_HOME dell'installazione di IBM SDK. --I Indica al compilatore di cercare nella directory $JAVA_HOME /include/zos, oltre alle directory predefinite, i file di intestazione (in questo caso, i file di intestazione JNI). Sample.c Il tuo programma C. $JAVA_HOME/lib/j9vm/libjvm.x Il file sidedeck che consente al codice nativo di collegare e risolvere le API JNI e Invocation. - Eseguire l'applicazione
Sample.Poiché si è utilizzata l'API Java 'System.loadLibraryper specificare la libreria condivisa di destinazione, è necessario assicurarsi che la variabile d'ambiente 'LIBPATHo la proprietà 'java.library.pathincluda la directory in cui risiede la libreria 'libSample.so.Ad esempio:
oppureLIBPATH=. java Samplejava -Djava.library.path=. SampleIl programma emette il messaggio seguente:Printing from native
Risultati
Ora è possibile utilizzare lo stesso framework per accedere alle librerie condivise native dalle applicazioni Java.