JNI ラッパーの構成スクリプトに取り組んでいます。構成パラメータの 1 つに へのパスがありますjni.h
。このパラメーターが C++ コンパイル用に正しく設定されているかどうかを確認するための、迅速かつ汚い Autoconf テストは何ですか? Linux で実行していて、利用可能であると想定できg++
ます。
または、このパスを直接取得する方法javah
(またはサポート ツール) はありますか?
JNI ラッパーの構成スクリプトに取り組んでいます。構成パラメータの 1 つに へのパスがあります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
しかし、構成時に設定することを要求するよりも良い解決策はありません。このようなものがさまざまな OS (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
])])
参考までに - 最新の 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";;