2008-10-02 14 views
4

Je travaille sur un script de configuration pour un wrapper JNI. L'un des paramètres de configuration est le chemin vers jni.h. Qu'est-ce qu'un bon test Autoconf rapide et corrompu pour savoir si ce paramètre est correctement défini pour la compilation C++? Vous pouvez supposer que vous utilisez Linux et que g++ est disponible.Test autoconf pour JNI include dir

Sinon, est-il possible d'obtenir javah (ou un outil de support) pour me donner ce chemin directement?

Répondre

5

La vérification des en-têtes est facile; il suffit d'utiliser AC_CHECK_HEADER. Si c'est dans un endroit étrange (c'est-à-dire, un que le compilateur ne connaît pas), il est tout à fait raisonnable de s'attendre à ce que les utilisateurs définissent CPPFLAGS.

La partie difficile est en réalité libjvm. Vous ne voulez généralement pas de lien avec ceci; mais vous souhaiterez peut-être définir par défaut un emplacement sur dlopen depuis si JAVA_HOME n'est pas défini lors de l'exécution.

Mais je n'ai pas une meilleure solution que d'exiger que JAVA_HOME soit défini au moment de la configuration. Il y a juste trop de variations dans la façon dont ce matériel est déployé sur différents systèmes d'exploitation (même seulement les distributions Linux). C'est ce que je fais:

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

FWIW, cette rune autoconf n'aide pas à localiser jni.h elle-même, donc elle n'aide pas beaucoup avec la question originale. – fche

5

Ensuite, il y a la voie facile: http://www.gnu.org/software/autoconf-archive/ax_jni_include_dir.html

Parfois, il est préférable de simplement utiliser les standards recipies.

+2

Si vous regardez la date sur la question et la date de copyright sur ce fichier, vous verrez qu'il n'y avait pas de "recette standard" lorsque la réponse ci-dessus a été acceptée. –