5

我正在为 JNI 包装器编写配置脚本。配置参数之一是jni.h. 对于 C++ 编译是否正确设置了这个参数,什么是一个好的快速和肮脏的 Autoconf 测试?您可以假设您在 Linux 上运行并且g++可用。

或者,有没有办法让javah(或支持工具)直接给我这条路?

4

3 回答 3

7

然后是简单的方法:http ://www.gnu.org/software/autoconf-archive/ax_jni_include_dir.html

有时最好只使用标准食谱。

于 2013-06-27T09:00:19.767 回答
5

检查标题很容易;只需使用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
])])
于 2008-10-02T19:08:41.230 回答
0

仅供参考 - 下面针对最新 ax_jni_include_dir.m4 的补丁适用于 Macos 11.1。

--- a/m4/ax_jni_include_dir.m4
+++ b/m4/ax_jni_include_dir.m4
@@ -73,13 +73,19 @@ fi
 
 case "$host_os" in
         darwin*)        # Apple Java headers are inside the Xcode bundle.
-            macos_version=$(sw_vers -productVersion | sed -n -e 's/^@<:@0-9@:>@
*.\(@<:@0-9@:>@*\).@<:@0-9@:>@*/\1/p')
-            if @<:@ "$macos_version" -gt "7" @:>@; then
-                _JTOPDIR="$(xcrun --show-sdk-path)/System/Library/Frameworks/JavaVM.framework"
-                _JINC="$_JTOPDIR/Headers"
+            major_macos_version=$(sw_vers -productVersion | sed -n -e 's/^\(@<:@0-9@:>@*\).@<:@0-9@:>@*.@<:@0-9@:>@*/\1/p')
+            if @<:@ "$major_macos_version" -gt "10" @:>@; then
+                _JTOPDIR="$(/usr/libexec/java_home)"
+                _JINC="$_JTOPDIR/include"
             else
-                _JTOPDIR="/System/Library/Frameworks/JavaVM.framework"
-                _JINC="$_JTOPDIR/Headers"
+                macos_version=$(sw_vers -productVersion | sed -n -e 's/^@<:@0-9@:>@*.\(@<:@0-9@:>@*\).@<:@0-9@:>@*/\1/p')
+                if @<:@ "$macos_version" -gt "7" @:>@; then
+                    _JTOPDIR="$(xcrun --show-sdk-path)/System/Library/Frameworks/JavaVM.framework"
+                    _JINC="$_JTOPDIR/Headers"
+                else
+                    _JTOPDIR="/System/Library/Frameworks/JavaVM.framework"
+                    _JINC="$_JTOPDIR/Headers"
+                fi
             fi
             ;;
         *) _JINC="$_JTOPDIR/include";;
于 2020-12-20T03:52:36.143 回答