Я работаю над сценарием конфигурации для оболочки JNI. Один из параметров конфигурации - путь к jni.h. Какой хороший быстрый и грязный тест Autoconf на правильность установки этого параметра для компиляции C++? Вы можете предположить, что работаете в Linux и g++ доступен.
В качестве альтернативы, есть ли способ заставить javah (или вспомогательный инструмент) напрямую указать мне этот путь?




Проверить заголовки очень просто; просто используйте 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
])])
Тогда есть простой способ: http://www.gnu.org/software/autoconf-archive/ax_jni_include_dir.html
Иногда лучше использовать стандартные рецепты.
Если вы посмотрите на дату вопроса и дату авторского права на этот файл, вы увидите, что не было «стандартного рецепта», когда был принят приведенный выше ответ.
Если кому-то интересно, как использовать этот m4, вам нужно установить пакет, а для debian / ubuntu имя нужного пакета - autoconf-archive. Благодаря его полезному [сообщению] (`github.com/gpoo/ccfinderx/issues/1#issuecomment-1977 34028)
По состоянию на ноябрь 2020 года этот сценарий примерно 2008 года (серийный номер 15) не может обнаруживать заголовки в MacOS Big Sur, если вы установили Oracle JDK.
К вашему сведению - нижеприведенный патч против последней версии 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@:>@*//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@:>@*//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@:>@*//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";;
FWIW, эта руна autoconf не помогает найти сам jni.h, поэтому не очень помогает с исходным вопросом.