我已经创建了一个PHP扩展(用C语言编写)来创建JVM使用jni_CreateJavaVM API。我正在使用JNI来进行Java调用。无法在Fedora 8的
我用jni_CreateJavaVM创建JVM。这在正常工作:
- IIS(窗口)
- 阿帕奇(窗口)
- PHP CLI(Fedora的8)
但是当我尝试加载从Apache相同的扩展名(在Fedore 8),创建jni_ CreateJavaVM返回JNI _ERROR。我从PHP _RINIT _FUNCTION调用jni _CreateJavaVM。
不过,我觉得这可能是我的分机不能libjvm.so loacate。所以在相同的代码中,在调用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
}
你是如何尝试加载libjvm.so的?通过使用绝对路径?或者只是文件名,它从PATH env变量中拾取? – vpram86 2009-09-29 11:43:59
我在usr/lib中创建了libjvm.so的软链接。我只传递了文件名。 – ata 2009-09-29 12:10:19
您是否尝试在LD_LIBRARY_PATH中的原始JRE结构内部放置libjvm.so的路径,而不是符号链接。 jvm使用来自其实际位置的相对路径来查找所需的其他文件。至少在Windows预计!值得一试。 – vpram86 2009-09-29 13:07:59