一、前言

前面我们用三篇博客介绍了

  • OpenDDS在WIndows上的环境配置
  • 三种方式运行发布订阅示例程序
  • 创建自己的发布订阅程序

但上述都是OpenDDS自己的一个操作,那么如何在Java里面调用OpenDDS呢?

接下来介绍一下,如何使用Java来调用OpenDDS程序,介绍其准备工作和实例。

  • 首先,你的OpenDDS配置环境要能支持Java,因此之前的环境配置则不能满足,需要重新配置
    有了上述配置环境的基础,配置Java支持的环境就简单很多了,直接参考下面这篇博客OpenDDS配置Java运行环境_山中野竹的博客-CSDN博客
  • 通过一个实例,在IDEA开发工具上,进行Java调用OpenDDS服务

二、实例演示

调用过程主要分为以下几步

  • 生成要调用的发布订阅的 java程序和jar包文件
  • 将 相应的jar包上传到本地maven仓库,并在Java项目中引用该Jar包
  • 将生成的 Java程序放在项目中,并调用程序实现发布订阅服务

1. 生成 要调用的java相关文件

这一步和前面介绍过 创建自己的发布订阅程序有点像,因此就简要介绍了。主要步骤为:

  • 创建一个 messenger文件夹,创建一个 UserMessenger.idl 文件
module UserManager {
 
#pragma DCPS_DATA_TYPE "UserManager::User"
#pragma DCPS_DATA_KEY "UserManager::User id"
 
  struct User {
    long id;
    string name;
    boolean sexual;
    long age;
    double height;
  };
};

NDK调用java对象 java怎么调用sdk_NDK调用java对象

  • 在cmd命令行窗口,在messenger路径下执行命令生成 UserManager_Export.h 文件
generate_export_file.pl UserManager>UserManager_Export.h

NDK调用java对象 java怎么调用sdk_jvm_02

NDK调用java对象 java怎么调用sdk_NDK调用java对象_03

  

  • 创建 UserManager.mpc 文件
project: dcps_test_java {
 
  idlflags     += -Wb,stub_export_include=UserManager_Export.h \
                  -Wb,stub_export_macro=UserManager_Export
  dcps_ts_flags+= -Wb,export_macro=UserManager_Export
  idl2jniflags += -Wb,stub_export_include=UserManager_Export.h \
                  -Wb,stub_export_macro=UserManager_Export
  dynamicflags += USERMANAGER_BUILD_DLL
 
  specific {
    jarname     = UserManager
  }
 
  TypeSupport_Files {
    UserManager.idl
  }
}
  • cmd命令窗口,在该路径下,使用mwc命令编译 mpc文件
perl E:\Software\Work\OpenDDS\ACE_wrappers\bin\mwc.pl -type vc10

NDK调用java对象 java怎么调用sdk_java_04

NDK调用java对象 java怎么调用sdk_java_05

  • 使用vc++ 编译 messenger.sln文件,先在vc++中打开文件,选择自己的运行环境(32位或者64位)然后生成解决方案即可

基本上配置完Java的环境都是64位的。

NDK调用java对象 java怎么调用sdk_开发语言_06

得到我们需要的 UserMessenger.jar包文件

NDK调用java对象 java怎么调用sdk_开发语言_07

生成成功后,检查生成Jar包文件是否完整,检查生成文件中“classes-UserManager”文件夹下是否有UserTypeSupportImpl.class,即类型支持实现类文件

如果没有该文件,后期Java调用Jar包会有问题,为防止此问题,再使用VS对 Messenger.sln编译一下即可。

NDK调用java对象 java怎么调用sdk_开发语言_08

第二步第三步参考了以下两篇博客,大家可以先学习一下

OpenDDS Java开发(一):理解Messenger示例_hbyangland的博客-CSDN博客_java opendds

OpenDDS Java开发(二):根据IDL进行代码生成_hbyangland的博客-CSDN博客_idl 代码生成

2. 上传 jar包文件到仓库,并在项目中引用

在项目创建libs文件夹,并添加jar包文件,前三个jar是在OpenDDS/lib文件夹中,第四个是第一步生成的,根据业务需要确定第四个

NDK调用java对象 java怎么调用sdk_jar包_09

第一次执行示例时,第四个jar包请采用OpenDDS自带的项目Jar包,jar包为messenger_idl_test.jar,jar包位置在:\OpenDDS\java\tests\messenger\messenger_idl 

然后将jar包上传到maven仓库,使用cmd命令进行上传

// 上传格式
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>
// 格式说明    
<path-to-file>: 要安装的JAR的本地路径 ./libs/json-simple-1.1.1.jar
<group-id>:要安装的JAR的Group Id
<artifact-id>: 要安装的JAR的 Artificial Id
<version>: JAR 版本
<packaging>: 打包类型,例如JAR
// 上传案例
mvn install:install-file –Dfile=E:\Software\Work\OpenDDS\OpenDDS-3.10\java\tests\messenger\messenger_idl\messenger_idl_test.jar -DgroupId=com.dds.messenger -DartifactId=dds-messenger -Dversion=1.0 -Dpackaging=JAR

在maven仓库检查是否上传成功

仓库位置C:\Users\admin.m2\repository

NDK调用java对象 java怎么调用sdk_jar包_10

NDK调用java对象 java怎么调用sdk_开发语言_11

上传成功后,在项目中设置pom文件,  

// 添加jar包依赖(第一个依赖根据自己需要jar包更换)
 		<dependency>
            <groupId>com.dds.messengerAll</groupId>
            <artifactId>dds-messengerAll</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/libs/UserManager.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.dds.OpenDDS_DCPS</groupId>
            <artifactId>dds-OpenDDS_DCPS</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/libs/OpenDDS_DCPS.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.dds.tao_java</groupId>
            <artifactId>dds-tao_java</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/libs/tao_java.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.dds.i2jrt</groupId>
            <artifactId>dds-i2jrt</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/libs/i2jrt.jar</systemPath>
        </dependency>
        
 // 因为idea的默认配置文件都是放在src/main/resources目录下,如果想要编译src/libs目录下的jar包,要在pom的build里配置resource
 		<resources>
            <resource>
                <!-- directory 表示取该目录下的文件 -->
                <directory>src/libs</directory>
                <!--targetPath 指定打包到哪个目录下  默认是放到class目录下-->
                <targetPath>/BOOT-INF/lib/</targetPath>
                <!-- 取符合格式的所有文件  *代表全部 -->
                <includes>
                    <include>**/*.jar</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>
        
        
        // 准备工作完成

3.将生成的 Java程序放在项目中,并调用程序实现发布订阅服务

使用OpenDDS自带的java文件

\OpenDDS-3.10\java\tests\messenger\publisher下的TestPublisher.java

\OpenDDS-3.10\java\tests\messenger\subscriber下的TestSubscriber.java和DataReaderListenerImpl.java

将文件放进项目中,然后调用文件执行发布订阅

NDK调用java对象 java怎么调用sdk_jvm_12

 平台执行发布订阅需要给定发布订阅启动参数

// 在发布订阅执行前,先定义字符串数组,后期要用 
String[] ARGS = {"-DCPSBit","0","-DCPSConfigFile","C:\\Users\\lwy\\Desktop\\ddsexample\\demo-java\\messenger\\rtps.ini"};



// 注意最后一项是发布订阅的方式的配置文件路径,可以选用点对点方式,或者仓库方式
// 点对点方式,最后一项选择本地点对点配置文件,配置文件内容如下:  
// 文件格式为.ini
[common]
DCPSGlobalTransportConfig=$file
DCPSDefaultDiscovery=DEFAULT_RTPS

[transport/the_rtps_transport]
transport_type=rtps_udp

// 仓库方式,最后一项选择本地仓库配置文件,配置文件内容如下:
// 其中第一项是你的仓库repo文件路径,注意file://+路径
// 文件格式为.ini
[common]
DCPSInfoRepo=file://E:\Software\Work\OpenDDS\OpenDDS-3.10\java\tests\messenger\repo.ior
DCPSGlobalTransportConfig=$file

[transport/1]
transport_type=tcp

然后分别调用发布和订阅函数(只写了业务逻辑,前后端如何调用大家自行编写)

先调用订阅

// 注入订阅类
@Resource
private TestSubscriber testSubscriber;


// 订阅
testPublisher.publish(ARGS);

调用发布

// 注入发布类
@Resource
private TestPublisher testPublisher;


// 发布
testSubscriber.subscribe(ARGS);

然后进行项目打包,通过项目中的maven-lifecycle-package,双击进行项目打包,

NDK调用java对象 java怎么调用sdk_java_13

打包完成后,开始部署项目,测试发布订阅。在项目打包好的jar路径下执行命令行命令

运行命令如下:命令行中两个路径分别是opendds/lib路径和自己jar包位置路径

// 使用点对点方式,在项目jar文件路径下,使用命令行运行
java -ea -Dopendds.native.debug=true -Djava.library.path=E:\Software\Work\OpenDDS\OpenDDS-3.10\lib;C:\Users\lwy\Desktop\ddsexample\0830ceshi\Messenger -jar XXX.jar 

// 使用仓库方式
// 首先,在一个cmd窗口开启仓库,该窗口执行路径在对应的仓库配置文件和repo.ior文件路径下
DCPSInfoRepo -o
// 然后第二个窗口,项目jar文件路径下,执行如下命令
java -ea -Dopendds.native.debug=true -Djava.library.path=E:\Software\Work\OpenDDS\OpenDDS-3.10\lib;C:\Users\lwy\Desktop\ddsexample\0830ceshi\Messenger -jar XXX.jar

!!!! 记录自己的一个小问题

在新电脑上集成DDS程序,集成好跑程序时,显示找不到自定义的jar包,此时自定义的jar包我拷贝到一个路径上了,却显示找不到,于是在新电脑上重新生成了该jar包(前面生成jar包的步骤,在新电脑上来了一遍!),之后就能跑通程序了。  也不知道是不是这个问题,衰

出了问题就是根据报错,去猜想,去试,去问,去查!   共勉!

自己的一点实践,内容较多,细节不易一一展示,希望能帮到大家!

点个赞吧