Pregunta

Estoy trabajando en una secuencia de comandos de configuración para un contenedor JNI. Uno de los parámetros de configuración es la ruta a jni.h . ¿Qué es una buena prueba de Autoconf rápida y sucia para determinar si este parámetro está configurado correctamente para la compilación de C ++? Puede asumir que se está ejecutando en Linux y g ++ está disponible.

Alternativamente, ¿hay una manera de que javah (o una herramienta de soporte) me dé este camino directamente?

¿Fue útil?

Solución

La comprobación de encabezados es fácil; simplemente use AC_CHECK_HEADER . Si está en un lugar extraño (es decir, uno que el compilador no conoce), es completamente razonable esperar que los usuarios configuren CPPFLAGS .

La parte difícil es ubicar libjvm . Normalmente no quieres vincular con esto; pero es posible que desee establecer una ubicación predeterminada para dlopen desde si JAVA_HOME no está configurado en el tiempo de ejecución.

Pero no tengo una solución mejor que requerir que JAVA_HOME se configure al momento de configurar. Hay demasiada variación en cómo se implementa este material en varios sistemas operativos (incluso solo en distribuciones de Linux). Esto es lo que hago:

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
])])

Otros consejos

Luego está la manera fácil: http://www.gnu.org /software/autoconf-archive/ax_jni_include_dir.html

A veces es mejor usar solo las recetas estándar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top