JNI和Java:ant调用make或者make调用ant?
我将首次进入JNI(Java本机接口)领域,以提供从平台特定的C / C ++代码到Java的文件系统更改通知。除非有人建议我做一些我想念的出色的图书馆来这样做。
作为JNI的新手,我设法在它的接口方面和它的库生成方面找到了很多文档,但是在构建本机库方面我发现不了多少。
我已经为先前存在的Java源代码建立了一个基于ant的现有构建,因此我正在尝试确定是否应该让ant调用make来创建库,或者最好是在创建后让make来调用ant。图书馆?
这两个选项都不是非常好用,但都比试图让ant调用编译器编译代码并直接生成库更好。
解决方案
回答
作为JNI的一种更简单的替代方法,请尝试JNA:https://jna.dev.java.net/,可以为我们解决此麻烦并且变得更简单(假设它可以执行我们想要的操作)。
回答
我强烈不喜欢make,因为它隐含的规则集和对空格的处理。我个人将使用cpp任务(http://ant-contrib.sourceforge.net/cpptasks/index.html)进行C编译。它们不像make那样灵活,但也要复杂得多,这意味着我们不必负担开发人员学习make的负担。
回答
我现在正在做类似的事情。请注意,使用swig.org中的swig通常更容易,因为它会为我们生成本机库的存根。
对于问题的简短回答是,由于Java库依赖于swig生成的标头(由java类文件生成),因此ant文件应在java库已经构建之后运行make文件。
如果我们对ant非常熟悉,并且不想学习新系统,那么http://ant-contrib.sourceforge.net/cpptasks/index.html(也与其他海报链接)将使我们可以在蚂蚁。
回答
我将完全跳过JNI,并使用一个在标准输出上写入通知的外部程序。然后,Java可以简单地从程序输出流中读取并生成任何必需的事件。如果我们只想发送简单的通知,则JNI太多了。
另外,在Linux上,我们可以简单地启动" inotifywait"(使用一些合适的参数,请参阅" man inotifywait")。
回答
我们也可以在Codemesh上尝试terp C ++任务。它们不是免费的,但是它们提供了高级抽象,并且具有发现/指定C ++编译器的能力以及为多平台构建而迭代多个编译器/处理器体系结构/编译器配置的能力。