java - CMake 和 Java : compile, 不是 jar,用于 javah

标签 java java-native-interface cmake

当使用 JNI 时,我们会在 bash/cmd 上执行以下操作:

  1. 编译源代码
  2. 生成 header
  3. 构建原生库
  4. 将整个内容压缩

在脚本中,类似于:

javac foo.java
javah foo
cmake . && make
jar .....

如何在 CMake 上重现?

除了使用 CUSTOM_COMMAND 之外,我只能找到 add_jar 来编译 java 源代码。是否可以在 CMake 中编译源代码而不需要随后将它们打包?

或者我应该辞职并add_jar java源,构建库并再次add_jar?

此外,Java_JAVAH_EXECUTABLE 应该如何与 CUSTOM_COMMAND 一起使用?

最佳答案

我有一个项目正在尝试实现这样的目标。 (一些 Android NDK 使用 android-cmake 工作,但取得的成功有限,尽管这不是您问题的重点。)

CMake 确实支持构建 Java 的选项。 [参见注释 1] 然而,这正是它的导向方式:就这个构建系统而言,您的 native 代码是一等公民,因此,如果您正在考虑走与我相同的道路,请记住这一点。有些人在 ant/maven 或类似的东西下使用 CMake 作为其 Java 工作流程的组件,并且 are various plugins在“更大”构建的范围内加载 CMake 项目。

但我认为这确实损害了 CMake 生成器的值(value)。我研究过这样做,但最终我们没有走那条路。这确实是您必须为自己做出的选择。 (我发现这个项目 Java,而不是 Java,所以对我来说做一些更像你所要求的事情是有意义的之后。)

事情是这样的:add_jar 有一点黑盒魔法。如果你想集成 UseJNI...好吧,我找不到太多支持的方式。 (通读 CMake 2.8.x 中包含的模块的源代码会公开诸如 CMAKE_JNI_TARGET 之类的内容。尽管我从未真正实现过该功能,但无论如何我 included it 。这是我针对此问题的自定义解决方案:

Good stuff for your top-level CMakeLists.txt in projects that use Java

Contains the definition of a helpful macro: javah

A sample of how to use the macro around native libraries

[1] 在撰写本文时,似乎有两种方法:

  • 通过项目(PROJECT_NAME Java)通知CMake它需要找到一个通用的Java编译器
  • find_package({Java, JNI}),它公开了更多功能,包括 add_jar

Here is reference for the later我发现自己引用了很多。

祝你好运。

关于java - CMake 和 Java : compile, 不是 jar,用于 javah,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15480502/

相关文章:

java - 使用 Apache HttpClient 发布 MultipartEntity 时,ByteArrayBody 可以工作,但 InputStreamBody 会抛出 NoHttpResponseException

java - 最大堆找到第 k 个最小元素

java - 将 C++ long 类型转换为 JNI jlong

java - JNI,我找不到内存泄漏的代码地方

c++ - CMake 无法在新版本中识别 C++ 编译器版本

java - 使用 Java 连接到 MongoDB 时遇到问题

java - 我有一个正在更改的数组,即使我没有专门更改它

android-intent - 从 native 代码发送广播意图失败

c++ - cmake .exe 和终端命令之间的 ROOT 结果不匹配

c++ - OpenCV 未定义引用(带 vector 的 FileStorage<KeyPoint>)