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