【发布时间】:2017-10-29 13:39:44
【问题描述】:
我有一个想要分发的带有 C JNI 后端的 Java 应用程序。分发 Java 部分很容易——这正是 jar 和 JVM 的用途。分发预编译的 C 代码并不容易,我想我必须要求用户自己构建本机库。
目前我使用ant 构建Java 代码和make 构建C 代码。问题是我在我的 Makefile 中硬编码了jni.h 和jni_md.h 的位置,这远非便携。我已经在万维网中搜索了尽可能多的 JNI 示例,并且所有这些示例都在某处具有硬编码路径。如果它是 JNI 以外的任何包,我可以很高兴地使用 pkg-config 之类的东西来获得正确的包含标志,但据我所知,JNI 不提供任何此类功能。
问题:我如何编写一个可移植 makefile 来查找 JNI 头文件并在任何*系统中编译我的 C 本机代码?
作为参考,以下是我考虑过的几个选项:
我可以使用 CMake 的 FindJNI 函数,但我宁愿不使用,因为 C 代码不是那么复杂,而且 CMake 会有点矫枉过正(加上对用户的额外依赖)。
我希望设置
JAVA_HOME环境变量,但我不希望总是这样,因为(至少在 Ubuntu 中)安装 Java 时默认情况下没有设置它。我可以使用
locate或find来手动查找文件并将包含标志拼接在一起,但这感觉相当hacky。
*我最感兴趣的是 Windows、OSX 和主流 Ubuntu 版本以及任何合理的现代 Java 版本。
【问题讨论】:
-
如何在你的包中分发正确版本的
jni.h? -
@KinCheung 感谢您的评论。
jni.h不是依赖于安装的具体Java版本吗?在我的系统中jni.h在/usr/lib/jvm/java-8-openjdk-amd64中,所以AFAIK 只是抓住jni.h不一定适用于除OpenJDK 8 之外的任何Java 系统。不是这样吗?
标签: java c makefile java-native-interface