]> granicus.if.org Git - php/commitdiff
Dynamically load java support, for better error messages
authorSam Ruby <rubys@php.net>
Sat, 25 Mar 2000 15:57:04 +0000 (15:57 +0000)
committerSam Ruby <rubys@php.net>
Sat, 25 Mar 2000 15:57:04 +0000 (15:57 +0000)
ext/java/config.m4
ext/java/java.c
ext/rpc/java/config.m4
ext/rpc/java/java.c
ext/standard/dl.c

index 7e390703b62b6e8d2ceb442a161fefd27b2993c7..45de70a6975d514a2a9041eba322b601c6b88b08 100644 (file)
@@ -22,14 +22,16 @@ AC_ARG_WITH(java,
     fi
 
     if test -d $withval/lib/kaffe; then
+      AC_ADD_LIBPATH($withval/lib)
       AC_ADD_LIBPATH($withval/lib/kaffe)
 
       JAVA_CFLAGS="-DKAFFE"
       JAVA_INCLUDE=-I$withval/include/kaffe
       JAVA_CLASSPATH=$withval/share/kaffe/Klasses.jar
+      JAVA_LIB=kaffevm
 
-      test -f $withval/lib/libkaffevm.so && AC_ADD_LIBPATH($withval/lib)
-      AC_ADD_LIBRARY(kaffevm)
+      test -f $withval/lib/$JAVA_LIB && JAVA_LIBPATH=$withval/lib
+      test -f $withval/lib/kaffe/$JAVA_LIB && JAVA_LIBPATH=$withval/lib/kaffe
 
       # accomodate old versions of kaffe which don't support jar
       if kaffe -version 2>&1 | grep 1.0b > /dev/null; then
@@ -37,7 +39,9 @@ AC_ARG_WITH(java,
       fi
 
     elif test -f $withval/lib/libjava.so; then
-      AC_ADD_LIBRARY_WITH_PATH(java, $withval/lib)
+      AC_ADD_LIBPATH($withval/lib)
+      JAVA_LIB=java
+      JAVA_LIBPATH=$withval/lib
       JAVA_INCLUDE="-I$withval/include"
       test -f $withval/lib/classes.zip && JAVA_CFLAGS="-DJNI_11"
       test -f $withval/lib/jvm.jar     && JAVA_CFLAGS="-DJNI_12"
@@ -60,6 +64,8 @@ AC_ARG_WITH(java,
        test -f $i/classes.zip  && JAVA_CLASSPATH="$i/classes.zip"
        test -f $i/rt.jar       && JAVA_CLASSPATH="$i/rt.jar"
        if test -f $i/libjava.so; then 
+          JAVA_LIB=java
+          JAVA_LIBPATH=$i
          AC_ADD_LIBPATH($i)
          test -d $i/classic && AC_ADD_LIBPATH($i/classic)
          test -d $i/native_threads && AC_ADD_LIBPATH($i/native_threads)
@@ -72,12 +78,17 @@ AC_ARG_WITH(java,
       fi
 
       JAVA_CFLAGS="$JAVA_CFLAGS -D_REENTRANT"
-      AC_ADD_LIBRARY(java)
     fi
 
     AC_DEFINE(HAVE_JAVA,1,[ ])
+    JAVA_CFLAGS="$JAVA_CFLAGS '-DJAVALIB=\"$JAVA_LIBPATH/lib$JAVA_LIB.so\"'"
+
     if test "$PHP_SAPI" != "servlet"; then
       PHP_EXTENSION(java, shared)
+
+      if test "$PHP_SAPI" = "cgi"; then
+        AC_ADD_LIBRARY($JAVA_LIB)
+      fi
     fi
 
     INSTALL_IT="$INSTALL_IT; \$(INSTALL) -m 0755 \$(srcdir)/ext/java/php_java.jar \$(libdir)"
index 9b0c2c53c2157f2fb78f23ce8b9cf014f06c1bb1..b22911749ad8ae7d9c714e7981a85d3c65babe8c 100644 (file)
@@ -1,4 +1,4 @@
-/*
+ /*
    +----------------------------------------------------------------------+
    | PHP version 4.0                                                      |
    +----------------------------------------------------------------------+
 
 #ifdef PHP_WIN32
 #ifdef JNI_12
-#pragma comment(lib,"jvm.lib")
+#define JAVALIB "jvm.dll"
 #else
-#pragma comment(lib,"javai.lib")
+#define JAVALIB "javai.dll"
 #endif
 #else
-static void *javadl = 0;
 #endif
 
 /***************************************************************************/
@@ -67,12 +66,14 @@ static int le_jobject = 0;
 static char *classpath = 0;
 static char *libpath   = 0;
 static char *javahome  = 0;
+static char *javalib   = 0;
 
 static int iniUpdated  = 0;
 
 static JavaVM *jvm = 0;
 static JNIEnv *jenv = 0;
 static jclass php_reflect;
+static void *dl_handle = 0;
 
 static zend_class_entry java_class_entry;
 
@@ -91,6 +92,13 @@ PHP_INI_BEGIN()
   PHP_INI_ENTRY1("java.library.path",
     NULL, PHP_INI_ALL, OnIniUpdate, &libpath)
 #endif
+#ifdef JAVALIB
+  PHP_INI_ENTRY1("java.library",
+    JAVALIB, PHP_INI_ALL, OnIniUpdate, &javalib)
+#else
+  PHP_INI_ENTRY1("java.library",
+    NULL, PHP_INI_ALL, OnIniUpdate, &javalib)
+#endif
 PHP_INI_END()
 
 /***************************************************************************/
@@ -105,9 +113,7 @@ void jvm_destroy() {
     (*jvm)->DestroyJavaVM(jvm);
     jvm = 0;
   }
-#ifndef PHP_WIN32
-  if (javadl) dlclose(javadl);
-#endif
+  if (dl_handle) DL_UNLOAD(dl_handle);
   php_reflect = 0;
   jenv = 0;
 }
@@ -134,6 +140,11 @@ static int jvm_create() {
   jclass local_php_reflect;
   jthrowable error;
 
+  jint (JNICALL *JNI_CreateVM)(const void*,const void*,void*);
+#ifndef JNI_12
+  jint (JNICALL *JNI_DefaultArgs)(void*);
+#endif
+
 #ifdef JNI_11
   JDK1_1InitArgs vm_args;
 #else
@@ -145,6 +156,29 @@ static int jvm_create() {
 
   iniUpdated=0;
 
+  if (javalib) {
+    dl_handle = DL_LOAD(javalib);
+
+    if (!dl_handle) {
+      php_error(E_ERROR, "Unable to load Java Library %s", javalib);
+      return -1;
+    }
+  }
+
+#ifndef JAVALIB
+  if (!dl_handle)
+    JNI_CreateVM = &JNI_CreateJavaVM;
+  else
+#endif
+
+  JNI_CreateVM = (jint (JNICALL *)(const void*,const void*,void*))
+    DL_FETCH_SYMBOL(dl_handle, "JNI_CreateJavaVM");
+
+  if (!JNI_CreateVM) {
+    php_error(E_ERROR, "Unable to locate CreateJavaVM function");
+    return -1;
+  }
+
 #ifdef JNI_12
 
   vm_args.version = JNI_VERSION_1_2;
@@ -156,12 +190,24 @@ static int jvm_create() {
   if (javahome)  addJVMOption(&vm_args, "-Djava.home=",         javahome);
   if (libpath)   addJVMOption(&vm_args, "-Djava.library.path=", libpath);
 
-  rc = JNI_CreateJavaVM(&jvm, (void**)&jenv, &vm_args);
-
 #else
 
+#ifndef JAVALIB
+  if (!dl_handle)
+    JNI_DefaultArgs = &JNI_GetDefaultJavaVMInitArgs;
+  else
+#endif
+
+  JNI_DefaultArgs = (jint (JNICALL *)(void*))
+    DL_FETCH_SYMBOL(dl_handle, "JNI_GetDefaultJavaVMInitArgs");
+
+  if (!JNI_DefaultArgs) {
+    php_error(E_ERROR, "Unable to locate GetDefaultJavaVMInitArgs function");
+    return -1;
+  }
+
   vm_args.version=0x00010001;
-  JNI_GetDefaultJavaVMInitArgs(&vm_args);
+  (*JNI_DefaultArgs)(&vm_args);
 
   if (!classpath) classpath = "";
   vm_args.classpath = classpath;
@@ -169,10 +215,11 @@ static int jvm_create() {
   vm_args.classhome = javahome;
   vm_args.libraryhome = libpath;
 #endif
-  rc = JNI_CreateJavaVM(&jvm, &jenv, &vm_args);
 
 #endif
 
+  rc = (*JNI_CreateVM)(&jvm, &jenv, &vm_args);
+
   if (rc) {
     php_error(E_ERROR, "Unable to create Java Virtual Machine");
     return rc;
index 7e390703b62b6e8d2ceb442a161fefd27b2993c7..45de70a6975d514a2a9041eba322b601c6b88b08 100644 (file)
@@ -22,14 +22,16 @@ AC_ARG_WITH(java,
     fi
 
     if test -d $withval/lib/kaffe; then
+      AC_ADD_LIBPATH($withval/lib)
       AC_ADD_LIBPATH($withval/lib/kaffe)
 
       JAVA_CFLAGS="-DKAFFE"
       JAVA_INCLUDE=-I$withval/include/kaffe
       JAVA_CLASSPATH=$withval/share/kaffe/Klasses.jar
+      JAVA_LIB=kaffevm
 
-      test -f $withval/lib/libkaffevm.so && AC_ADD_LIBPATH($withval/lib)
-      AC_ADD_LIBRARY(kaffevm)
+      test -f $withval/lib/$JAVA_LIB && JAVA_LIBPATH=$withval/lib
+      test -f $withval/lib/kaffe/$JAVA_LIB && JAVA_LIBPATH=$withval/lib/kaffe
 
       # accomodate old versions of kaffe which don't support jar
       if kaffe -version 2>&1 | grep 1.0b > /dev/null; then
@@ -37,7 +39,9 @@ AC_ARG_WITH(java,
       fi
 
     elif test -f $withval/lib/libjava.so; then
-      AC_ADD_LIBRARY_WITH_PATH(java, $withval/lib)
+      AC_ADD_LIBPATH($withval/lib)
+      JAVA_LIB=java
+      JAVA_LIBPATH=$withval/lib
       JAVA_INCLUDE="-I$withval/include"
       test -f $withval/lib/classes.zip && JAVA_CFLAGS="-DJNI_11"
       test -f $withval/lib/jvm.jar     && JAVA_CFLAGS="-DJNI_12"
@@ -60,6 +64,8 @@ AC_ARG_WITH(java,
        test -f $i/classes.zip  && JAVA_CLASSPATH="$i/classes.zip"
        test -f $i/rt.jar       && JAVA_CLASSPATH="$i/rt.jar"
        if test -f $i/libjava.so; then 
+          JAVA_LIB=java
+          JAVA_LIBPATH=$i
          AC_ADD_LIBPATH($i)
          test -d $i/classic && AC_ADD_LIBPATH($i/classic)
          test -d $i/native_threads && AC_ADD_LIBPATH($i/native_threads)
@@ -72,12 +78,17 @@ AC_ARG_WITH(java,
       fi
 
       JAVA_CFLAGS="$JAVA_CFLAGS -D_REENTRANT"
-      AC_ADD_LIBRARY(java)
     fi
 
     AC_DEFINE(HAVE_JAVA,1,[ ])
+    JAVA_CFLAGS="$JAVA_CFLAGS '-DJAVALIB=\"$JAVA_LIBPATH/lib$JAVA_LIB.so\"'"
+
     if test "$PHP_SAPI" != "servlet"; then
       PHP_EXTENSION(java, shared)
+
+      if test "$PHP_SAPI" = "cgi"; then
+        AC_ADD_LIBRARY($JAVA_LIB)
+      fi
     fi
 
     INSTALL_IT="$INSTALL_IT; \$(INSTALL) -m 0755 \$(srcdir)/ext/java/php_java.jar \$(libdir)"
index 9b0c2c53c2157f2fb78f23ce8b9cf014f06c1bb1..b22911749ad8ae7d9c714e7981a85d3c65babe8c 100644 (file)
@@ -1,4 +1,4 @@
-/*
+ /*
    +----------------------------------------------------------------------+
    | PHP version 4.0                                                      |
    +----------------------------------------------------------------------+
 
 #ifdef PHP_WIN32
 #ifdef JNI_12
-#pragma comment(lib,"jvm.lib")
+#define JAVALIB "jvm.dll"
 #else
-#pragma comment(lib,"javai.lib")
+#define JAVALIB "javai.dll"
 #endif
 #else
-static void *javadl = 0;
 #endif
 
 /***************************************************************************/
@@ -67,12 +66,14 @@ static int le_jobject = 0;
 static char *classpath = 0;
 static char *libpath   = 0;
 static char *javahome  = 0;
+static char *javalib   = 0;
 
 static int iniUpdated  = 0;
 
 static JavaVM *jvm = 0;
 static JNIEnv *jenv = 0;
 static jclass php_reflect;
+static void *dl_handle = 0;
 
 static zend_class_entry java_class_entry;
 
@@ -91,6 +92,13 @@ PHP_INI_BEGIN()
   PHP_INI_ENTRY1("java.library.path",
     NULL, PHP_INI_ALL, OnIniUpdate, &libpath)
 #endif
+#ifdef JAVALIB
+  PHP_INI_ENTRY1("java.library",
+    JAVALIB, PHP_INI_ALL, OnIniUpdate, &javalib)
+#else
+  PHP_INI_ENTRY1("java.library",
+    NULL, PHP_INI_ALL, OnIniUpdate, &javalib)
+#endif
 PHP_INI_END()
 
 /***************************************************************************/
@@ -105,9 +113,7 @@ void jvm_destroy() {
     (*jvm)->DestroyJavaVM(jvm);
     jvm = 0;
   }
-#ifndef PHP_WIN32
-  if (javadl) dlclose(javadl);
-#endif
+  if (dl_handle) DL_UNLOAD(dl_handle);
   php_reflect = 0;
   jenv = 0;
 }
@@ -134,6 +140,11 @@ static int jvm_create() {
   jclass local_php_reflect;
   jthrowable error;
 
+  jint (JNICALL *JNI_CreateVM)(const void*,const void*,void*);
+#ifndef JNI_12
+  jint (JNICALL *JNI_DefaultArgs)(void*);
+#endif
+
 #ifdef JNI_11
   JDK1_1InitArgs vm_args;
 #else
@@ -145,6 +156,29 @@ static int jvm_create() {
 
   iniUpdated=0;
 
+  if (javalib) {
+    dl_handle = DL_LOAD(javalib);
+
+    if (!dl_handle) {
+      php_error(E_ERROR, "Unable to load Java Library %s", javalib);
+      return -1;
+    }
+  }
+
+#ifndef JAVALIB
+  if (!dl_handle)
+    JNI_CreateVM = &JNI_CreateJavaVM;
+  else
+#endif
+
+  JNI_CreateVM = (jint (JNICALL *)(const void*,const void*,void*))
+    DL_FETCH_SYMBOL(dl_handle, "JNI_CreateJavaVM");
+
+  if (!JNI_CreateVM) {
+    php_error(E_ERROR, "Unable to locate CreateJavaVM function");
+    return -1;
+  }
+
 #ifdef JNI_12
 
   vm_args.version = JNI_VERSION_1_2;
@@ -156,12 +190,24 @@ static int jvm_create() {
   if (javahome)  addJVMOption(&vm_args, "-Djava.home=",         javahome);
   if (libpath)   addJVMOption(&vm_args, "-Djava.library.path=", libpath);
 
-  rc = JNI_CreateJavaVM(&jvm, (void**)&jenv, &vm_args);
-
 #else
 
+#ifndef JAVALIB
+  if (!dl_handle)
+    JNI_DefaultArgs = &JNI_GetDefaultJavaVMInitArgs;
+  else
+#endif
+
+  JNI_DefaultArgs = (jint (JNICALL *)(void*))
+    DL_FETCH_SYMBOL(dl_handle, "JNI_GetDefaultJavaVMInitArgs");
+
+  if (!JNI_DefaultArgs) {
+    php_error(E_ERROR, "Unable to locate GetDefaultJavaVMInitArgs function");
+    return -1;
+  }
+
   vm_args.version=0x00010001;
-  JNI_GetDefaultJavaVMInitArgs(&vm_args);
+  (*JNI_DefaultArgs)(&vm_args);
 
   if (!classpath) classpath = "";
   vm_args.classpath = classpath;
@@ -169,10 +215,11 @@ static int jvm_create() {
   vm_args.classhome = javahome;
   vm_args.libraryhome = libpath;
 #endif
-  rc = JNI_CreateJavaVM(&jvm, &jenv, &vm_args);
 
 #endif
 
+  rc = (*JNI_CreateVM)(&jvm, &jenv, &vm_args);
+
   if (rc) {
     php_error(E_ERROR, "Unable to create Java Virtual Machine");
     return rc;
index 4a2357f9671dff0f7b8adf9083a6c19c7d53992c..68f58614d99387587c1b356dfd2fc63a5c09d55f 100644 (file)
 #ifdef HAVE_LIBDL
 #include <stdlib.h>
 #include <stdio.h>
-#ifndef RTLD_LAZY
-#define RTLD_LAZY 1    /* Solaris 1, FreeBSD's (2.1.7.1 and older) */
-#endif
-
-#ifndef RTLD_NOW /* Fixes compile problem on FreeBSD */
-#define RTLD_NOW RTLD_LAZY
-#endif
-
 
 #if HAVE_STRING_H
 #include <string.h>