IBM®WebSphere®Application Server是与Java®EE 6兼容,健壮且高度可用的中间件环境,它提供了一个用于托管和管理各种企业应用程序的平台。 一些用户可能会遇到需要将其基于Java的应用程序与基于本机C / C ++的实现集成在一起的场景。 例如,涉及国防,航空航天,天气预报和其他科学应用程序的应用程序包含某些算法,这些算法只能使用这些本机语言来实现,它们太复杂,太困难或太冒险而无法用Java实现。
要将此类基于C的实现与Java程序集成在一起,您需要在两种编程语言API之间架起某种桥梁。 Java本机接口(JNI)提供了此桥梁,可以在Java和C / C ++ API之间交换数据。 为了实现此解决方案,您需要使用要公开给其他Java类的方法在Java中定义接口,从该接口的编译代码中生成头文件,然后将头文件导入本机共享库模块中,例如Windows®的动态链接库(.dll)和基于UNIX®的系统的共享对象(.so)库。 可以通过许多供应商提供的各种工具来创建这些模块。
本文介绍了一些步骤,这些步骤将简化通过Java本机接口(JNI)将部署在WebSphere Application Server上的基于Java的应用程序与基于C的实现的集成。 最后,您将能够为WebSphere Application Server创建,配置和调用共享库。
此处包含的信息适用于IBM WebSphere Application Server V6.1,V7和V8,并且假定您熟悉相应的IBMRational®工具。 请注意,此处提供的示例是非常基本的示例,用于说明所涉及的高级开发过程,并且未解决通常在典型应用程序开发中通常包含的数据验证或其他良好实践。
<APPSERVER_ROOT>java\bin>javah -o header_file_name.h <JAVA_CLASS_NAME>
请记住,在DLL模块中编译Java头代码时需要引用jni.h,您可以将此文件从{APPSERVER_ROOT} / java / include目录复制到C编辑器位置,并将其放置在include路径中这将确保成功编译DLL。 生成DLL后,可以将文件复制到WebSphere Application Server中的适当位置。
要使用WebSphere Application Server配置DLL,请将DLL复制到{APPSERVER_ROOT}目录中创建的文件夹中(图8),并通过导航到Server> ServerTypes> WebSphere Application Server> server1> Java和在JVM定制属性中配置其路径。 流程管理>流程定义> Java虚拟机>定制属性 (图9)。
如果未在WebSphere Application Server中设置此JVM定制属性,则当类加载器尝试加载DLL时将产生异常(图10)。
将DLL路径设置为WebSphere Application Server中的JVM定制属性后,必须重新启动服务器。
为了显示DLL中定义的方法的调用,将使用EAR文件中部署在WebSphere Application Server中的servlet。 从任何Java类调用本机方法之前,无论它是独立的还是EAR的一部分,您都需要在静态块中使用System.loadlibrary调用来加载它。 这样,在类加载的初始步骤中将DLL加载(图11)。
要从Java类调用本机方法,必须在类路径中具有用于生成头文件的本机类。 在此示例中,该类作为JAR文件放入WEB-INF / lib目录中,以使servlet在运行时对其进行解析(图12)。
部署EAR之后,您必须重新启动服务器,因为servlet在启动时即被加载,从而又加载了DLL。 由于本机库已加载到WebSphere Application Server本机内存中,因此需要重新启动服务器。 否则,您将得到一个异常,说明调用Servlet时该库已经由另一个类加载器加载了。
您可以在此处测试两种解决方案,一种是将简单的数据类型传递给本机方法,另一种是通过数组:
简单的加法测试在此测试中,您在数据字段中输入Integer值,并将这些值相加后得到结果。
在此测试中,您在JSP中输入一个包含10个值的数组,而该数组又将通过servlet调用本机方法,该servlet显示数组中每个字段的双精度值。
本文展示了一些简化的示例,这些示例显示了如何通过JNI(Java本机接口)使用C API,并通过共享动态链接库(DLL)在它们之间建立桥梁,从而可以将WebSphere Application Server中运行的Java代码与基于C的实现集成在一起。
翻译自: https://www.ibm.com/developerworks/websphere/techjournal/1203_chandra/1203_chandra.html