JNI的Autoconf测试包含目录

时间:2020-03-06 15:02:28  来源:igfitidea点击:

我正在为JNI包装器配置脚本。配置参数之一是jni.h的路径。关于此参数是否为C ++编译正确设置的一项很好的快速而又肮脏的Autoconf测试?我们可以假设我们正在Linux上运行,并且可以使用g ++

另外,有没有办法让" javah"(或者支持工具)直接给我这个路径?

解决方案

检查标题很容易;只需使用" AC_CHECK_HEADER"即可。如果它位于一个奇怪的地方(即编译器不知道的地方),则完全有理由期望用户设置" CPPFLAGS"。

困难的部分实际上是定位libjvm。我们通常不希望与此链接。但如果运行时未设置JAVA_HOME,则可能需要默认为dlopen的位置。

但是我没有比在配置时设置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
])])