سؤال

وأنا أعمل على برنامج التكوين للمجمع JNI. واحدة من معلمات التكوين هو السبيل إلى jni.h. ما هو جيد اختبار Autoconf سريعة وقذرة لما إذا كان يتم تعيين هذه المعلمة بشكل صحيح من أجل تجميع C ++؟ يمكنك أن تفترض أنك تعمل على لينكس وg++ هو متاح.

وبدلا من ذلك، هناك طريقة للحصول على javah (أو أداة دعم) أن تعطيني هذا الطريق مباشرة؟

هل كانت مفيدة؟

المحلول

والتحقق من وجود رؤوس من السهل. مجرد استخدام AC_CHECK_HEADER. لو كان في مكان غريب (أي واحد المترجم لا يعرف عن)، فإنه من المعقول تماما أن نتوقع للمستخدمين مجموعة CPPFLAGS.

والجزء الصعب هو في الواقع تحديد مكان libjvm. كنت عادة لا تريد الارتباط مع هذا. ولكنك قد تريد الافتراضي إلى موقع لdlopen ذلك من إذا لم يتم تعيين JAVA_HOME في وقت التشغيل.

ولكن ليس لدي حل أفضل من التي تتطلب أن تعيين هذا JAVA_HOME في وقت تكوين. هناك فقط الكثير من الاختلاف في كيفية نشر هذه الاشياء عبر مختلف أنظمة تشغيل (حتى مجرد توزيعات لينكس). هذا هو ما أقوم به:

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

وأحيانا يكون من الأفضل أن مجرد استخدام الاكلات القياسية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top