我正在为JNI包装器编写配置脚本.其中一个配置参数是路径jni.h
.对于是否为C++编译正确设置了此参数,有什么好的快速和脏的Autoconf测试?您可以假设您在Linux上运行并且g++
可用.
或者,有没有办法让javah
(或支持工具)直接给我这条路径?
然后有简单的方法:http://www.gnu.org/software/autoconf-archive/ax_jni_include_dir.html
有时最好只使用标准的收件人.
检查标题很容易; 只是用AC_CHECK_HEADER
.如果它处于一个奇怪的地方(即编译器不知道的那个),那么期望用户设置是完全合理的CPPFLAGS
.
困难的部分实际上是定位libjvm
.您通常不希望与此链接; 但是dlopen
如果JAVA_HOME
未在运行时设置,则可能需要默认为它的位置.
但我没有比要求JAVA_HOME
在配置时设置更好的解决方案.在各种操作系统(甚至只是Linux发行版)中部署这些内容的方式太多了.这就是我做的:
AC_CHECK_HEADER([jni.h], [have_jni=yes]) AC_ARG_VAR([JAVA_HOME], [Java Runtime Environment (JRE) location]) AC_ARG_ENABLE([java-feature], [AC_HELP_STRING([--disable-java-feature], [disable Java feature])]) case $target_cpu in x86_64) JVM_ARCH=amd64 ;; i?86) JVM_ARCH=i386 ;; *) JVM_ARCH=$target_cpu ;; esac AC_SUBST([JVM_ARCH]) AS_IF([test X$enable_java_feature != Xno], [AS_IF([test X$have_jni != Xyes], [AC_MSG_FAILURE([The Java Native Interface is required for Java feature.])]) AS_IF([test -z "$JAVA_HOME"], [AC_MSG_WARN([JAVA_HOME has not been set. JAVA_HOME must be set at run time to locate libjvm.])], [save_LDFLAGS=$LDFLAGS LDFLAGS="-L$JAVA_HOME/lib/$JVM_ARCH/client -L$JAVA_HOME/lib/$JVM_ARCH/server $LDFLAGS" AC_CHECK_LIB([jvm], [JNI_CreateJavaVM], [LIBS=$LIBS], [AC_MSG_WARN([no libjvm found at JAVA_HOME])]) LDFLAGS=$save_LDFLAGS ])])