适配器开发工具箱用户指南
构建 JNI 适配器
要构建 JNI 适配器,请遵循以下步骤。
检查现有的 C++ API,并记下未在 Java 中定义的任何数据结构。您将需要在 C++ 粘接代码中转换这些数据结构。
使用 Java 中与那些方法最匹配的本机声明来创建“JNI 存根”库。您将需要对适配器将使用的 API 中出现的每个函数执行此操作。
运行
javah
来为存根库创建 C++ 头文件。示例用法:
javah com.ibm.wbia.TwineBall.jnibridge.JNIStubLibrary
在 C/C++ 中,在生成的头中实现每个函数。您将使用此代码来将 JNI 函数特征符粘接到 API 中。
用测试驱动程序测试“JNI 存根”库中的每个函数。
按编码 Java 适配器的相同方式开始编码适配器,并将“JNI 存根”库用作 Java API。
注意事项:
当同意使用 TwineBall 时,可能适合在 JNI 层的两端进行类型转换。
字符集非常重要。当在此示例中将 Java Unicode 字符串转换成 C++ 字符串时,会将它们转换为 UTF-8。如果应用程序不能处理 UTF-8,则您将需要将它们转换为特定代码页。当您执行此操作以处理所有可能的 Unicode 字符时,要特别细心,否则可能失败。
在许多版本的 HP-UX 上,您将需要声明并调用共享库中的
_main()
函数,以便使用 C++ 执行 JNI。这会指示操作系统初始化 C++ 运行时。Win32 上的相同代码将失败,因此
#defines
对于此移植问题可能是必要的。
线程安全
注意线程技术的以下方面。
记住,Java 适配器在缺省情况下是多线程的。可能要求您的适配器同时在多个线程上处理多个服务调用。如果本机代码不是线程安全的,则您可能需要在启动脚本中使用
-t
选项来将适配器变为单线程。
不要将 Java 对象在 C++ 环境中从一个线程传递至另一个线程,尽管您无论如何也不太可能在适配器中执行此操作。
全局访问对象的同步具有正常规则。
您不得将
JNIEnv*
从一个线程传递至另一个线程,或依赖于两个不同线程中相同的指针。
JVM 为每个线程创建不同的 JNI 环境,因此本机代码必须仅使用对当前线程有效的指针。