分类: Java
2009-07-12 20:44:04
当您需要使用以其他语言编写的对象时,本地事件源和 Java? 侦听器之间的通信可能需要一些小技巧 —— 尤其是在多线程环境中。本文通过使用一种透明处理从本地代码到 JVM 的事件通信的设计模式,帮助您有效地处理传统的本地库。 代理设计模式
但是这还没有完。需要记住的是,程序是以 C/C++ 语言编写的,因此,无法使用自动垃圾回收,因为程序不是使用 Java 语言编写的。一旦线程完成 JNI 调用,它需要通过调用 DetachCurrentThread 来释放接口指针。如果未做此调用并且线程存在,进程将无法正常终止。相反,它将一直等待现在已不存在的线程以 DestroyJavaVM 调用的方式从 JVM 中离开。
其余方法都自己附带有解释:
CJvm 类还在特定于线程的位置保存一个 JNI 环境指针。这是很有必要的,因为 JNI 环境指针是线程相关的。 Java 模块
为了构建针对 Win32 平台的 C++ 模块,我们提供了 Microsoft Developer Studio 项目文件和 cpp.dsw 工作区。您可以打开工作区,简单地构建 main 项目。工作区中的所有项目都以适当的依赖关系相关联。确保您的 Developer Studio 可以找到 JNI 头和编译时 JNI 库。可以通过选择 Tools > Options > Directories 菜单项完成这一工作。 构建成功之后,在可以执行示例程序之前,还需要完成几个步骤。 首先,因为用于构建 Java 类并包含 JNI 头和库的 JDK 可能有针对 Java Invocation API 的运行时组件,例如 jvm.dll,您必需设置它。最简单的方法是更新 PATH 变量。 其次,main 程序带有命令行参数,这些参数是简单的 JVM 参数。您需要至少传递两个参数给 JVM:
得到的控制台输出如下:
正如您从控制台输出所看到的,Java 侦听器产生与出于解释目的而构建的本地侦听器相同的结果。 结束语 本文展示了如何为本地应用程序生成的事件注册一个 Java 类作为侦听器。通过使用观察者设计模式,您已经减少了事件源与侦听器之间的耦合。您还通过使用代理设计模式隐藏了来自 Java 侦听器的事件源的实现细节。您可以使用该设计模式组合来将一个 Java UI 添加到现有的本地应用程序。
|
||||