Ecriture d'applications JNI
Les numéros de version Java™ Native Interface (JNI) valides que les programmes peuvent spécifier sur l'appel API JNI_CreateJavaVM() sont : JNI_VERSION_1_2(0x00010002) et JNI_VERSION_1_4(0x00010004).
Ce numéro de version détermine uniquement le niveau de JNI à utiliser. Le niveau réel de la machine virtuelle Java créée est spécifié par les bibliothèques JSE (utilisez la commande java -version pour afficher le niveau JVM). Le niveau JNI n'affecte pas la spécification de langue implémentée par la machine virtuelle Java, les API de bibliothèque de classes ou tout autre aspect du comportement de la machine virtuelle Java. Pour plus d'informations, voir https://docs.oracle.com/javase/8/docs/technotes/guides/jni/.
Si votre application a besoin de deux bibliothèques JNI, l'une pour 32 bits (31 bits sur z/OS®) et l'autre pour 64 bits, utilisez la propriété système com.ibm.vm.bitmode pour déterminer si vous utilisez une machine virtuelle Java 32 bits (31 bits sur z/OS) ou 64 bits et choisissez la bibliothèque appropriée.
Informations spécifiques aux systèmes Linux
gcc -Ijava_install_dir/include -Ljava_install_dir/jre/lib/j9vm
-ljvm -ldl -lpthread <JNI program filename>L'option -ljvm indique que libjvm.so est la bibliothèque partagée qui implémente la machine virtuelle Java. L'option
-lpthread indique que vous utilisez le support
pthread natif. Si vous n'établissez pas de
liaison à la bibliothèque pthread, un défaut de segmentation
(signal SIGSEGV) peut se produire à l'exécution du programme JNI.Informations spécifiques aux systèmes z/OS
Pour plus d'informations sur l'écriture d'applications 64 bits, voir IBM® Redpaper z/OS 64 bits C/C++ and Java Programming Environment à l'adresse http://www.redbooks.ibm.com/abstracts/redp9110.html.
Problèmes ASCII et EBCDIC: sous z/OS, la machine virtuelle Java est essentiellement une application EBCDIC. Toutefois, les chaînes littérales utilisées avec les routines JNI doivent être au format ASCII. Ne créez pas de routines JNI sous forme de méthodes C or C++ ASCII améliorées car sinon vous opérerez dans un environnement bimodal ; votre application sera à cheval entre un environnement ASCII et un environnement EBCDIC.
- Lors de l'utilisation du compilateur XL C/C++:
- Utilisez l'option de compilation XL C/C++ -Wc,convlit(ISO8859-1). Pour plus d'informations sur cette option, voir options-convlit-noconvlit dans le guide de l'utilisateurz/OS XL C/C++. Cette option crée tous les littéraux chaîne au format ASCII, mais ce processus peut être suspendu ou repris pour obtenir des littéraux EBCDIC en utilisant Pragmas (
#pragma) dans le programme.
- Utilisez l'option de compilation XL C/C++ -Wc,convlit(ISO8859-1). Pour plus d'informations sur cette option, voir options-convlit-noconvlit dans le guide de l'utilisateurz/OS XL C/C++. Cette option crée tous les littéraux chaîne au format ASCII, mais ce processus peut être suspendu ou repris pour obtenir des littéraux EBCDIC en utilisant Pragmas (
- Lors de l'utilisation du compilateur Open XL C/C++:
- Utilisez l'option '-fexec-charset=ISO8859-1 du compilateur Open XL C/C++. Pour plus d'informations sur cette option, voir la référence du compilateurIBM Open XL C/C++ pour z/OS. Cette option crée toutes les chaînes littérales au format ASCII,
mais le processus peut être suspendu ou repris pour obtenir les valeurs littérales EBCDIC
en utilisant des pragmas (
#pragma) dans le programme.Note : Lorsque '-Wc,convlit(ISO8859-1) ou '-fexec-charset=iso8859-1 est en vigueur, les fonctions de bibliothèque telles que 'printfattendent des caractères EBCDIC.
- Utilisez l'option '-fexec-charset=ISO8859-1 du compilateur Open XL C/C++. Pour plus d'informations sur cette option, voir la référence du compilateurIBM Open XL C/C++ pour z/OS. Cette option crée toutes les chaînes littérales au format ASCII,
mais le processus peut être suspendu ou repris pour obtenir les valeurs littérales EBCDIC
en utilisant des pragmas (
- Convertissez explicitement les littéraux EBCDIC en utilisant __etoa(), __etoa_l(), __e2a_s() ou __e2a_l(). Pour plus d'informations sur ces fonctions, voir le document z/OS XL C/C++ Runtime Library Reference.
Le problème inhérent aux programmes bimodaux est que, dans l'environnement d'exécution z/OS , les unités d'exécution sont désignées comme EBCDIC ou ASCII amélioré et ne sont pas destinées à être commutées entre ces modes lors d'une utilisation standard. Le mode ASCII étendu n'est pas conçu pour gérer les problèmes bimodaux. Vous pouvez obtenir des résultats inattendus ou des échecs lorsque le mode actif ne correspond pas au code compilé. Il existe des appels d'exécution z/OS que les applications peuvent utiliser pour basculer le mode actif entre EBCDIC et ASCII amélioré (les fonctions __ae_thread_swapmode() et __ae_thread_setmode() sont documentées dans Language Environment® Vendor Interfaces, voir le livre rougeSA22-7568-06 https://publibz.boulder.ibm.com/epubs/pdf/ceev1160.pdf Toutefois, même si une application est soigneusement codée pour passer d'un mode à l'autre correctement, d'autres problèmes bimodaux peut exister.