TwineBall 适配器通过 TwineBall 接口执行它对应用程序服务器的所有调用。在 Java RMI 中,对远程接口的调用由 JVM 自动编组。图 2 显示基于 Java RMI 的原始交互作用。
为了演示 JNI,已用 C++ 共享库替换图形的服务器端。现在该图形看起来象图 3。
因为定义良好的 Java 接口已经在调用应用程序,所以在适配器端几乎只需要进行很少的代码更改就能更改此接口的实现。这允许我们用相同适配器代码来演示使用 JNI 的适配器和使用 Java RMI 的适配器。仅接口后面的实现会更改。
TwineBall 接口大量使用 Java 向量。我们决定将向量转换成字符串数组,而不是尝试将这些向量引入 C++ 环境中。这就是 VectorToArrayBridge 所起的作用。如果适配器使用 Java 实用程序类更方便,则您可能想要使用类似的方法。
“JNI 存根库”声明本机方法。这就是将 C++ 中实现的方法与 Java 环境联系在一起的方法。
在本示例中,将用单个 C++ 模块来实现 C++ 共享库。然而,此共享库包括 JNI.H 头文件,从而可识别 Java 类型。基本 Java 类型和 C++ 类型之间的转换在 C++ 环境中仍经常发生。与现有的 C++ 应用程序/API 进行交互将需要编写新的 C++ 代码和 Java 代码。
请注意,将不再涉及数据库。在本示例中,将用预先确定的返回值来实现接口。
在样本 JNI 源代码中,您将找到以下各段。
文件名 | 功能 |
---|---|
Makefile.PLATFORM | 在给定的平台上构建 C++ 共享库。 |
com_ibm_wbia_TwineBall_jnibridge_JNIStubLibrary.cc |
C++ 共享库的源代码。包含 C++“粘接代码”。 |
com_ibm_wbia_TwineBall_jnibridge_JNIStubLibrary.h | C++ 共享库的头文件。 |
com.ibm.wbia.TwineBall.jnibridge.JNIStubLibrary | JNI 存根库 |
com.ibm.wbia.TwineBall.jnibridge.VectorToArrayBridge | 数组网桥的向量 |
com.ibm.wbia.TwineBall.jnibridge.test.TestDriver | JNI 存根库的测试驱动程序 |