1

我创建了一个 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
}
4

1 回答 1

0

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

但在大多数平台上,您可能只需删除对 JNI_GetDefaultJavaVMInitArgs 的调用。

于 2015-07-27T22:09:18.590 回答