我正准备第一次进入JNI(Java Native Interface)世界,提供从平台特定的C / C ++代码到Java的文件系统更改通知。这是除非有人建议我做错了一些很棒的图书馆。
刚接触JNI我已经设法在它的接口端和它的库生成方面找到了很多文档,但是我没有找到很多关于构建本机库的文档。
我已经有一个基于ant的现有版本用于预先存在的Java源代码,所以我正在尝试解决是否应该使用ant调用make来创建库,或者是否最好让make调用创建库后蚂蚁?
这两个选项都没有跳出来,因为非常好,但两者似乎都比试图让ant调用编译器来编译代码并直接生成库更好。
答案 0 :(得分:3)
作为JNI的一个更简单的替代方案,尝试JNA:https://jna.dev.java.net/,可以为您解决这个麻烦并且更简单(假设它可以做你想要的)。
答案 1 :(得分:3)
我非常不喜欢制作,因为它隐含的规则集和对空格的处理。我个人会使用cpp任务(http://ant-contrib.sourceforge.net/cpptasks/index.html)来进行C编译。它们不像make那样灵活,但它们也不那么复杂,这意味着你不必为开发人员带来学习成果。
答案 2 :(得分:1)
我正在研究类似的东西。请注意,使用swig.org中的swig通常更容易,因为它会为您生成本机库的存根。
你的问题的简短回答是,在已经构建了java库之后,ant文件应该运行make文件,因为本机库依赖于swig生成的头,它是从java类文件生成的。
如果你对ant非常熟悉,并且不想学习新系统,那么http://ant-contrib.sourceforge.net/cpptasks/index.html也可以通过另一张海报链接,让你在ant中构建c ++。
答案 3 :(得分:1)
我完全跳过JNI,并使用外部程序在标准输出上写入通知。然后,Java可以简单地从程序输出流中读取并生成任何必要的事件。如果你想要的只是发送简单的通知,那么JNI太过分了。
此外,在Linux上你可以简单地启动“inotifywait”(使用一些合适的参数,参见“man inotifywait”)。
答案 4 :(得分:0)
您还可以在Codemesh尝试terp C ++任务。它们不是免费的,但它们提供了高级抽象,能够发现/指定C ++编译器,并能够迭代多个平台构建的多个编译器/处理器架构/编译器配置。