اختبار Autoconf لJNI تشمل DIR
-
03-07-2019 - |
سؤال
وأنا أعمل على برنامج التكوين للمجمع 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
وأحيانا يكون من الأفضل أن مجرد استخدام الاكلات القياسية.