当使用 JNI 时,我们会在 bash/cmd 上执行以下操作:
- 编译源代码
- 生成 header
- 构建原生库
- 将整个内容压缩
在脚本中,类似于:
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/