JNI 和 Java:ant 调用 make 还是 make 调用 ant?
Posted
技术标签:
【中文标题】JNI 和 Java:ant 调用 make 还是 make 调用 ant?【英文标题】:JNI and Java: ant calling make or make calling ant? 【发布时间】:2010-09-06 03:07:43 【问题描述】:我即将第一次进入 JNI(Java 原生接口)世界,提供从平台特定 C/C++ 代码到 Java 的文件系统更改通知。除非有人建议我错过了一些出色的图书馆来做这件事。
作为 JNI 的新手,我设法在它的接口方面和库生成方面找到了很多文档,但在构建本机库方面我没有找到太多。
我有一个基于 ant 的现有 Java 源代码构建,所以我正在尝试确定是否应该让 ant 调用 make 来创建库,或者最好让 make 调用ant 创建库后?
这两个选项都不是非常好,但似乎都比试图让 ant 调用编译器来编译代码并直接生成库要好。
【问题讨论】:
【参考方案1】:我非常不喜欢 make,因为它隐含的规则集和对空格的处理。我个人会使用 cpp 任务 (http://ant-contrib.sourceforge.net/cpptasks/index.html) 来进行 C 编译。它们不像 make 那样灵活,但也没有那么复杂,这意味着您不必让开发人员负担学习 make 的负担。
【讨论】:
CPP 任务非常适合我需要的东西,谢谢。我最终需要进行一些交叉编译,但是指定用于 cpptasks 后端的类的能力解决了这个问题。【参考方案2】:作为 JNI 的更简单替代方案,试试 JNA:https://jna.dev.java.net/,可能会为您解决这个麻烦并且更简单(假设它可以做您想做的事)。
【讨论】:
JNA 看起来确实是做我想做的事的好方法,但遗憾的是我不得不开始创建新的窗口类并为其回调函数,这似乎不可能,所以我不得不退回使用 JNI。【参考方案3】:我会完全跳过 JNI,并使用在标准输出上写入通知的外部程序。然后 Java 可以简单地从程序输出流中读取并生成任何必要的事件。如果您只想发送简单的通知,那么 JNI 的工作量太大了。
此外,在 Linux 上,您可以简单地启动“inotifywait”(使用一些合适的参数,请参阅“man inotifywait”)。
【讨论】:
【参考方案4】:我现在正在做类似的事情。请注意,使用 swig.org 中的 swig 通常更容易,因为它会为您生成原生库的存根。
对您的问题的简短回答是,ant 文件应该在构建 java 库之后运行 make 文件,因为本机库依赖于 swig 生成的头文件,该头文件是从 java 类文件生成的。
如果你对ant超级熟悉,又不想学习新系统,那么http://ant-contrib.sourceforge.net/cpptasks/index.html,同样由另一张海报链接,让你在ant中构建c++。
【讨论】:
【参考方案5】:您也可以在Codemesh 尝试 terp C++ 任务。它们不是免费的,但它们提供了高级别的抽象,以及发现/指定 C++ 编译器的能力,以及为多平台构建迭代多个编译器/处理器架构/编译器配置的能力。
【讨论】:
以上是关于JNI 和 Java:ant 调用 make 还是 make 调用 ant?的主要内容,如果未能解决你的问题,请参考以下文章