Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JNI include dir的Autoconf测试_Java_Java Native Interface_Autoconf - Fatal编程技术网

Java JNI include dir的Autoconf测试

Java JNI include dir的Autoconf测试,java,java-native-interface,autoconf,Java,Java Native Interface,Autoconf,我正在为JNI包装器编写一个配置脚本。配置参数之一是jni.h的路径。什么是一个好的快速和肮脏的自动CONCOF测试,这个参数是否为C++编译正确设置?您可以假设您正在Linux上运行,并且g++可用 或者,有没有办法让javah(或支持工具)直接给我这个路径?检查标题很容易;只需使用AC\u CHECK\u标题。如果它位于一个奇怪的地方(即编译器不知道的地方),那么期望用户设置CPPFLAGS是完全合理的 困难的部分实际上是定位libjvm。您通常不想与此链接;但是,如果在运行时未设置JAVA

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


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

检查标题很容易;只需使用
AC\u CHECK\u标题
。如果它位于一个奇怪的地方(即编译器不知道的地方),那么期望用户设置
CPPFLAGS
是完全合理的

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

但我没有比要求在配置时设置
JAVA\u 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
])])

还有一个简单的方法:


有时最好只使用标准的recipies。

仅供参考-下面针对最新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";;
——a/m4/ax\u jni\u include\u dir.m4
+++b/m4/ax\u jni\u include\u dir.m4
@@-73,13+73,19@@fi
中的案例“$host_os”
darwin*)#Apple Java头在Xcode包中。
-macos_版本=$(软件版本-产品版本| sed-n-e's/^@@
*.\(@*\)。@*/\1/p')
-如果@;然后
-_JTOPDIR=“$(xcrun--show sdk path)/System/Library/Frameworks/JavaVM.framework”
-_JINC=“$_JTOPDIR/Headers”
+major_macos_version=$(软件版本-产品版本-sed-n-e's/^\(@*\)。@*@*@*/\1/p')
+如果@;然后
+_JTOPDIR=“$(/usr/libexec/java_home)”
+_JINC=“$_JTOPDIR/include”
其他的
-_JTOPDIR=“/System/Library/Frameworks/JavaVM.framework”
-_JINC=“$_JTOPDIR/Headers”
+macos_版本=$(软件版本-产品版本sed-n-e's/^@*.\(@*\).@*/\1/p')
+如果@;然后
+_JTOPDIR=“$(xcrun--show sdk path)/System/Library/Frameworks/JavaVM.framework”
+_JINC=“$_JTOPDIR/Headers”
+否则
+_JTOPDIR=“/System/Library/Frameworks/JavaVM.framework”
+_JINC=“$_JTOPDIR/Headers”
+fi
fi
;;
*)_JINC=“$_JTOPDIR/include”;;

FWIW,这个autoconf符文对定位jni.h本身没有帮助,因此对原始问题没有多大帮助。如果你查看问题上的日期和该文件上的版权日期,你会发现在接受上述答案时没有“标准配方”。如果有人想知道如何使用这个m4东西,您需要安装该软件包,对于debian/ubuntu,您需要的软件包名称是
autoconf-archive
。多亏了他在2020年11月发表的有用的[post](`),如果您安装了Oracle的JDK,那么circa 2008脚本(序列号15)无法检测MacOS Big Sur上的头文件。