编写 JNI 应用程序

程序可在 "JNI_CreateJavaVM() API 调用中指定的有效 Java™ 本地接口 (JNI) 版本号为API 调用时可指定的有效 Java™ 本地接口(JNI)版本号有 JNI_VERSION_1_2(0x00010002) 和 'JNI_VERSION_1_4(0x00010004) 。

限制: 不支持 JNI 的 V 1.1 。

此版本号仅决定要使用的 JNI 级别。 所创建的 JVM 的实际级别由 JSE 库指定(使用 java -version 命令来显示 JVM 级别)。 JNI 级别影响 JVM 实现的语言规范、类库 API 或任何其他范围的 JVM 行为。 有关更多信息,请参阅 https://docs.oracle.com/javase/8/docs/technotes/guides/jni/

如果应用程序需要两个 JNI 库,一个为 32 位 ( z/OS®上的 31 位) 构建,另一个为 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 位 C/C++ and Java Programming Environment ( http://www.redbooks.ibm.com/abstracts/redp9110.html)。

ASCII 和 EBCDIC 问题: 在 z/OS上, Java 虚拟机本质上是 EBCDIC 应用程序。 然而,与 JNI 例程结合使用的字符串字面值必须采用 ASCII 格式。 请勿创建 JNI 例程作为增强的 ASCII C 或 C++ 方法,因为您将在双模环境下操作,而您的应用程序将跨 ASCII 和 EBCDIC 环境运行。

可以通过两种方法来创建 ASCII 字面值:
  • 使用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 reference。 此选项可创建采用 ASCII 格式的所有字符串字面值,但可在程序中使用 pragmas (#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++运行时库参考》。

双峰程序的固有问题是,在 z/OS 运行时环境中,线程被指定为 EBCDIC 或增强型 ASCII ,并且不打算在典型使用中在这些方式之间切换。 增强的 ASCII 并非设计用来解决双模问题。 当活动模式无法与所编译代码的模式匹配时,您可能会得到意外结果或遇到故障。 应用程序可以使用z/OS运行时调用在 EBCDIC 和增强型 ASCII 之间切换活动模式(__ae_thread_swapmode()__ae_thread_setmode()函数已在语言环境® 供应商接口中记录,请参阅SA22-7568-06红皮书 https://publibz.boulder.ibm.com/epubs/pdf/ceev1160.pdf。 然而,即使应用程序进行了仔细的编码,能够正确切换模式,也可能存在其他的双模问题。