JNI アプリケーションの作成

プログラムがJNI_CreateJavaVM() APIコールで指定できる有効なJava™ Native Interface (JNI)バージョン番号は、次のとおりです:JNI_VERSION_1_2(0x00010002)とJNI_VERSION_1_4(0x00010004)です。

制約事項: JNI のバージョン 1.1 はサポートされていません。

このバージョン番号で決まるのは、使用する JNI のレベルのみです。 実際に作成されるJVMのレベルは、JSEライブラリによって指定されます(JVMレベルを表示するには、java -versionコマンドを使用)。 JNI レベルは、JVM によって実装される言語仕様、 クラス・ライブラリー API、またはその他の範囲の JVM 動作に影響しません。 詳しくは、「 https://docs.oracle.com/javase/8/docs/technotes/guides/jni/」を参照してください。

アプリケーションに 2 つの JNI ライブラリーが必要な場合 (1 つは 32 ビット用 ( z/OS®上の 31 ビット) 用、もう 1 つは 64 ビット用)、 com.ibm.vm.bitmode システム・プロパティーを使用して、32 ビット ( z/OS上の 31 ビット) または 64 ビット JVM で実行しているかどうかを判別し、適切なライブラリーを選択します。

Linux システムに固有の情報

ローカル・アプリケーションをコンパイルおよびリンクするには、次のコマンドを使用します。
gcc -Ijava_install_dir/include -Ljava_install_dir/jre/lib/j9vm 
-ljvm -ldl -lpthread <JNI program filename>
-ljvm オプションは、 libjvm.so が JVM を実装する共有ライブラリーであることを指定します。 -lpthread オプションは、ネイティブ pthread サポートを使用することを指示します。pthread ライブラリーとリンクしないと、 JNI プログラムの実行時にセグメンテーション障害 (シグナル SIGSEGV) が発生する可能性があります。

z/OS システムに固有の情報

64 ビット・アプリケーションの作成について詳しくは、「 IBM® Redpaper z/OS 64-bit C/C++ and Java Programming Environment 」( http://www.redbooks.ibm.com/abstracts/redp9110.html) を参照してください。

ASCII および EBCDIC の問題: z/OSでは、Java 仮想マシンは基本的に EBCDIC アプリケーションです。 ただし、JNI ルーチンで使用されるストリング・リテラルは ASCII フォーマットでなければなりません。 2 モード対応の環境で作業を行うことになるため (つまり、アプリケーションが ASCII 環境と EBCDIC 環境の両方で使用されるため)、JNI ルーチンを 拡張 ASCII の C メソッドまたは C++ メソッドとして作成しないでください。

ASCII リテラルを作成する方法は 2 つあります。
  • XL C/C++コンパイラを使用する場合:
    • XL C/C++コンパイラー・オプション-Wc,convlit(ISO8859-1)を使用します。 このオプションの詳細については、z/OS XL C/C++ユーザー・ガイドoptions-convlit-noconvlitを参照してください。 このオプションは、すべてのストリング・リテラルをASCIIフォーマットで作成しますが、プログラム内で プラグマ#pragma)を使用してEBCDICリテラルを取得するために、このプロセスを中断または再開することができます。
  • Open XL C/C++コンパイラ使用時:
    • Open XL C/C++コンパイラのオプション '-fexec-charset=ISO8859-1 を使用する。 このオプションの詳細については、IBM Open XL C/C++forz/OSCompiler リファレンスを参照してください。 このオプションが指定されると、ストリング・リテラルはすべて ASCII フォーマットで作成されます。 ただし、プログラムでプラグマ (#pragma) を使用すれば、EBCDIC リテラルを取得するために、 このプロセスを中断したり再開したりできます。
      注意:'-Wc,convlit(ISO8859-1)または'-fexec-charset=iso8859-1が有効な場合、'printfなどのライブラリ関数はEBCDIC文字を期待する。
  • __etoa()__etoa_l()__e2a_s()、または __e2a_l() を使用して EBCDIC リテラルを明示的に変換します。 これらの関数の詳細については、z/OS XL C/C++ランタイム・ライブラリ・リファレンスを参照してください。

2 モード・プログラムに固有の問題は、 z/OS ランタイム環境では、スレッドが EBCDIC または拡張 ASCII のいずれかとして指定され、標準的な用途でこれらのモードを切り替えることを意図していないことです。 拡張 ASCII は、2 モードの問題に対処するように設計されていません。 アクティブ・モードとコンパイル・コードのモードが一致していない場合、予期しない結果または障害が生じる可能性があります。 アプリケーションがアクティブモードをEBCDICと拡張ASCIIの間で切り替えるために使用する可能性のあるz/OSランタイムコールがあります(__ae_thread_swapmode()__ae_thread_setmode()関数は、Language Environment® Vendor Interfaces、SA22-7568-06Red Book https://publibz.boulder.ibm.com/epubs/pdf/ceev1160.pdf)で文書化されています。 ただし、正しくモードを切り替えるようにアプリケーションを慎重にコード化しても、他の 2 モードの問題が存在する可能性があります。