在WebSphere Application Server中集成Java EE应用程序和基于C的实现

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®工具。 请注意,此处提供的示例是非常基本的示例,用于说明所涉及的高级开发过程,并且未解决通常在典型应用程序开发中通常包含的数据验证或其他良好实践。

创建本机共享库

  1. 打开IBM Integration Designer并创建一个独立的Java项目(图1)。
    图1.创建独立项目
    图1.创建独立项目
  2. 使用要与本机方法关联的方法创建一个Java类(图2)。 方法声明将取决于您要调用的C方法的签名。 在这种情况下,假定第三方C API需要简单类型和数据数组(在这种情况下为双精度数组)。 (要调用另一个本机库,您需要通过在标头实现过程中导入其标头文件来将其与DLL关联。)
    图2.创建Java类
    图2.创建Java类
  3. 编译Java接口,并在{APPSERVER_ROOT} / Java / bin目录中的编译生成的.class文件上运行javah命令,以生成相应的C头文件(图3)。

    <APPSERVER_ROOT>java\bin>javah -o header_file_name.h <JAVA_CLASS_NAME>

    图3.生成C头文件
    图3.生成C头文件
  4. 接下来,您需要使用头文件中生成的方法来创建本机共享库。 您可以在C API到C API调用期间将这个库实现与其他C库集成(图4)。
    图4. Java头文件代码
    图4. Java头文件代码
  5. 需要将图4中所示的标头代码复制到共享库项目中,以生成.dll或.so库。 您可以使用任何C / C ++编辑器来创建这些共享库。 DLL项目的标头(.h文件,图5)和实现(.c文件,图6)部分与其他部分分开,具体取决于您使用的编辑器。
    图5.将Java头文件代码复制到dll项目头部分
    图5.将Java头文件代码复制到dll项目头部分
    图6.“实现”部分中的Java标头方法的实现
    图6.“实现”部分中的Java标头方法的实现
  6. 注意,jni.h在WebSphere Application Server的Java运行时include目录中位于{APPSERVER_ROOT} / Java / include(图7)中。
    图7. jni.h在WebSphere中的位置。
    图7. jni.h在WebSphere中的位置

请记住,在DLL模块中编译Java头代码时需要引用jni.h,您可以将此文件从{APPSERVER_ROOT} / java / include目录复制到C编辑器位置,并将其放置在include路径中这将确保成功编译DLL。 生成DLL后,可以将文件复制到WebSphere Application Server中的适当位置。

在WebSphere Application Server中配置本机库

要使用WebSphere Application Server配置DLL,请将DLL复制到{APPSERVER_ROOT}目录中创建的文件夹中(图8),并通过导航到Server> ServerTypes> WebSphere Application Server> server1> Java和在JVM定制属性中配置其路径。 流程管理>流程定义> Java虚拟机>定制属性 (图9)。

图8.根目录中DLL的新文件夹
图8.根目录中DLL的新文件夹
图9. JVM定制属性
图9. JVM定制属性

如果未在WebSphere Application Server中设置此JVM定制属性,则当类加载器尝试加载DLL时将产生异常(图10)。

图10.类加载器异常
图10.类加载器异常

将DLL路径设置为WebSphere Application Server中的JVM定制属性后,必须重新启动服务器。

创建Java EE解决方案以使用WebSphere Application Server调用本机库

为了显示DLL中定义的方法的调用,将使用EAR文件中部署在WebSphere Application Server中的servlet。 从任何Java类调用本机方法之前,无论它是独立的还是EAR的一部分,您都需要在静态块中使用System.loadlibrary调用来加载它。 这样,在类加载的初始步骤中将DLL加载(图11)。

图11.类加载
图11.类加载

要从Java类调用本机方法,必须在类路径中具有用于生成头文件的本机类。 在此示例中,该类作为JAR文件放入WEB-INF / lib目录中,以使servlet在运行时对其进行解析(图12)。

图12.从Java类调用JNI代码
图12.从Java类调用JNI代码

部署EAR之后,您必须重新启动服务器,因为servlet在启动时即被加载,从而又加载了DLL。 由于本机库已加载到WebSphere Application Server本机内存中,因此需要重新启动服务器。 否则,您将得到一个异常,说明调用Servlet时该库已经由另一个类加载器加载了。

测试解决方案

您可以在此处测试两种解决方案,一种是将简单的数据类型传递给本机方法,另一种是通过数组:

  • 简单的加法测试

    在此测试中,您在数据字段中输入Integer值,并将这些值相加后得到结果。

    图13.简单的添加测试数据输入
    图13.简单的添加测试数据输入
    图14.简单的加法测试结果
    图14.简单的加法测试结果
  • 阵列数据测试

    在此测试中,您在JSP中输入一个包含10个值的数组,而该数组又将通过servlet调用本机方法,该servlet显示数组中每个字段的双精度值。

    图15.双值数组测试数据输入
    图15.双值数组测试数据输入
    图16.双值数组测试结果
    图16.双值数组测试结果

结论

本文展示了一些简化的示例,这些示例显示了如何通过JNI(Java本机接口)使用C API,并通过共享动态链接库(DLL)在它们之间建立桥梁,从而可以将WebSphere Application Server中运行的Java代码与基于C的实现集成在一起。


翻译自: https://www.ibm.com/developerworks/websphere/techjournal/1203_chandra/1203_chandra.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值