I have created a PHP extension (written in C). I am using JNI to make java calls.
I use jni_CreateJavaVM to create JVM. This works fine in:
- IIS (windows)
- Apache (windows)
- PHP CLI (Fedora 8)
But when I try to load the same extension from Apache (in Fedore 8), the create jni_ CreateJavaVM return JNI _ERROR. I call jni _CreateJavaVM from PHP _RINIT _FUNCTION.
I though that it might be that my extension cannot loacate libjvm.so. So in the same code, before calling jni_ CreateJavaVM, I tried to load the libjvm.so library, and it was successful. Only when I call the jni function, it returns JNI_ERROR.
I used LD_ LOAD function to load libjvm.so. After loading the library I obtain pointer to jni_ CreateJavaVM method which is successful. Only when I make a call, using the pointer or direct jni_ CreateJavaVM call, it returns -1.
Is there any way to find out what went wrong during initialization?
Platfrom: Fedora 8 Java: Jdk 1.5 update 8 Php: Php version 5.3
Here is the code that I have written to initialize JVM.
typedef jint (JNICALL CreateJavaVM_t)(JavaVM **pvm, void **env, void *args);
typedef jint (JNICALL* GetDefaultJavaVMInitArgs_t)(void*);
CreateJavaVM_t *CreateJavaVM;
GetDefaultJavaVMInitArgs_t GetDefaultJavaVMInitArgs;
JavaVM* jvm;
JNIEnv* env;
void create_vm(void)
{
JavaVMOption vm_options;
JavaVMInitArgs vm_args;
int retval = 0;
dl_handle = DL_LOAD("libjvm.so");
//The call is successful and I get the handle
CreateJavaVM = (CreateJavaVM_t*)DL_FETCH_SYMBOL(dl_handle, "JNI_CreateJavaVM");
//The call is successful and I get pointer to function
GetDefaultJavaVMInitArgs = (GetDefaultJavaVMInitArgs_t)DL_FETCH_SYMBOL(dl_handle,"JNI_GetDefaultJavaVMInitArgs");
//The call is successful and I get pointer to function
vm_args.version = JNI_VERSION_1_4;
vm_args.options = &vm_options;
vm_args.nOptions = 0;
vm_args.ignoreUnrecognized = JNI_FALSE;
(*GetDefaultJavaVMInitArgs)(&vm_args);
retval = CreateJavaVM(&jvm, (void **)&env, &vm_args);
//The retval is -1.
//And if I do
retval = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
//This also returns -1
}