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).

Restriction: la version 1.1 de l'interface JNI n'est pas prise en charge.

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

Pour compiler et lier une application locale, utilisez la commande suivante :
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.

Il existe deux façons de créer des littéraux ASCII :
  • 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.
  • 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 'printf attendent des caractères EBCDIC.
  • 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.