2009-09-29 49 views
0

我已经创建了一个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 
} 
+0

你是如何尝试加载libjvm.so的?通过使用绝对路径?或者只是文件名,它从PATH env变量中拾取? – vpram86 2009-09-29 11:43:59

+0

我在usr/lib中创建了libjvm.so的软链接。我只传递了文件名。 – ata 2009-09-29 12:10:19

+0

您是否尝试在LD_LIBRARY_PATH中的原始JRE结构内部放置libjvm.so的路径,而不是符号链接。 jvm使用来自其实际位置的相对路径来查找所需的其他文件。至少在Windows预计!值得一试。 – vpram86 2009-09-29 13:07:59

回答

0

这个问题已经五年了。在研究有关不同平台上函数JNI_GetDefaultJavaVMInitArgs的状态时,我偶然发现了它。它似乎是一个无需调用的函数,甚至可能在某些平台上被弃用。但是使用current documentation from Oracle(用于Java 1.7和1.8)作为主要参考,很明显,上面的代码有一个严重的错误。在调用JNI_GetDefaultJavaVMInitArgs之前,只应设置vm_args.version字段。调用JNI_GetDefaultJavaVMInitArgs之后,应该设置所有其他字段。

但在大多数平台上你也许可以简单地删除调用JNI_GetDefaultJavaVMInitArgs。