使用 CMake 和 Maven 构建C++和 Java 代码,并捆绑在一个罐子里

Building C++ and Java code using CMake and Maven and bundle in a jar

本文关键字:一个 罐子 构建 Maven CMake C++ Java 使用 代码      更新时间:2023-10-16

我有使用 CMake 构建的遗留C++代码。它会生成一个.so文件。我需要将此代码包装在 Java 中,并构建一个包含 Java 代码以及部署C++的jar

使用 CMake 构建C++代码的步骤很简单:

cd /to/pkg/dir
cmake .
make

.so文件在build/目录下生成。如果我将整个项目转换为 maven,我将不得不修改目录结构(这里有一篇博客文章解释了它是如何工作的:http://blog.bigpixel.ro/2012/07/building-cc-applications-with-maven/(。但是,我不想那样做。是否可以选择从 maven 调用上面显示的前两行来构建.so文件,然后将其包含在最终jar中?

在Apache Hadoop中,构建会执行类似于您所描述的操作。 我们在编译阶段使用 Apache Maven AntRun 插件对cmake进行外部调用,然后在 CMake 生成的构建输出上调用make来编译和链接代码库的 C 部分。 然后,此输出将馈送到我们的最终构建工件中。 在我们的例子中,这些构建工件是压缩包,而不是直接捆绑到jar文件中,但你可以通过控制Apache Maven JAR插件的配置来完成它。 具体而言,您可能需要覆盖内容包含/排除设置。

如果你想把它作为一个起点,Hadoop构建的相关部分在这里可见:

https://github.com/apache/hadoop/blob/release-2.7.3-RC2/hadoop-common-project/hadoop-common/pom.xml#L598-L615

<execution>
  <id>make</id>
  <phase>compile</phase>
  <goals><goal>run</goal></goals>
  <configuration>
    <target>
      <exec executable="cmake" dir="${project.build.directory}/native" failonerror="true">
        <arg line="${basedir}/src/ -DGENERATED_JAVAH=${project.build.directory}/native/javah -DJVM_ARCH_DATA_MODEL=${sun.arch.data.model} -DREQUIRE_BZIP2=${require.bzip2} -DREQUIRE_SNAPPY=${require.snappy} -DCUSTOM_SNAPPY_PREFIX=${snappy.prefix} -DCUSTOM_SNAPPY_LIB=${snappy.lib} -DCUSTOM_SNAPPY_INCLUDE=${snappy.include} -DREQUIRE_OPENSSL=${require.openssl} -DCUSTOM_OPENSSL_PREFIX=${openssl.prefix} -DCUSTOM_OPENSSL_LIB=${openssl.lib} -DCUSTOM_OPENSSL_INCLUDE=${openssl.include} -DEXTRA_LIBHADOOP_RPATH=${extra.libhadoop.rpath}"/>
      </exec>
      <exec executable="make" dir="${project.build.directory}/native" failonerror="true">
        <arg line="VERBOSE=1"/>
      </exec>
      <!-- The second make is a workaround for HADOOP-9215.  It can
           be removed when version 2.6 of cmake is no longer supported . -->
      <exec executable="make" dir="${project.build.directory}/native" failonerror="true"></exec>
    </target>
  </configuration>
</execution>