Autoconf test для JNI include dir

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

В качестве альтернативы, есть ли способ заставить javah (или вспомогательный инструмент) напрямую указать мне этот путь?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
0
2 189
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Проверить заголовки очень просто; просто используйте 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
])])

FWIW, эта руна autoconf не помогает найти сам jni.h, поэтому не очень помогает с исходным вопросом.

fche 02.05.2013 23:21

Тогда есть простой способ: http://www.gnu.org/software/autoconf-archive/ax_jni_include_dir.html

Иногда лучше использовать стандартные рецепты.

Если вы посмотрите на дату вопроса и дату авторского права на этот файл, вы увидите, что не было «стандартного рецепта», когда был принят приведенный выше ответ.

Chris Conway 27.06.2013 17:57

Если кому-то интересно, как использовать этот m4, вам нужно установить пакет, а для debian / ubuntu имя нужного пакета - autoconf-archive. Благодаря его полезному [сообщению] (`github.com/gpoo/ccfinderx/issues/1#issuecomment-1977‌ 34028)

smac89 13.10.2019 11:07

По состоянию на ноябрь 2020 года этот сценарий примерно 2008 года (серийный номер 15) не может обнаруживать заголовки в MacOS Big Sur, если вы установили Oracle JDK.

Dana Robinson 21.11.2020 12:10

К вашему сведению - нижеприведенный патч против последней версии 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";;

Другие вопросы по теме