我创建了一个 PHP 扩展(用 C 编写)。我正在使用 JNI 进行 java 调用。
我使用 jni_CreateJavaVM 创建 JVM。这适用于:
- IIS(窗口)
- 阿帕奇(Windows)
- PHP CLI (Fedora 8)
但是当我尝试从 Apache(在 Fedore 8 中)加载相同的扩展时,create jni_ CreateJavaVM 返回 JNI _ERROR。我从 PHP _RINIT _FUNCTION 调用 jni _CreateJavaVM。
我虽然可能是我的扩展无法找到 libjvm.so。所以在同样的代码中,在调用jni_CreateJavaVM之前,我尝试加载libjvm.so库,成功了。只有当我调用 jni 函数时,它才会返回 JNI_ERROR。
我使用 LD_ LOAD 函数来加载 libjvm.so。加载库后,我获得了指向 jni_CreateJavaVM 方法的指针,该方法成功。只有当我使用指针或直接 jni_CreateJavaVM 调用时,它才会返回 -1。
有没有办法找出初始化过程中出了什么问题?
平台:Fedora 8 Java:Jdk 1.5 更新 8 Php:Php 版本 5.3
这是我编写的用于初始化 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
}