【问题标题】:JVM crashing on attachCurrentThread JNI callback invocationJVM 在 attachCurrentThread JNI 回调调用时崩溃
【发布时间】:2014-10-31 14:37:09
【问题描述】:

希望你一切顺利。

我有一个 C 语言的 JNI 实现,其中一个 C 函数附加到当前 JVM 线程并回调一个 Java 方法,这实际上是在调用 attachCurrentThread() 函数时使 JVM 崩溃。 我的实现是基于链接Keeping a global reference to the JNIEnv environment

中给出的答案

线程创建部分将侦听套接字连接以接受事件并注入 GetEvent 函数。

// create thread for reading from socket.
        pthread_attr_init(&plafParams->readThreadAttr);
        pthread_attr_setdetachstate(&plafParams->readThreadAttr, PTHREAD_CREATE_JOINABLE);
        pthread_attr_setstacksize(&plafParams->readThreadAttr, 16384);
        plafParams->eventThreadFlag = 2;
        if(pthread_create(&plafParams->hReadThread_p, &plafParams->readThreadAttr, ( void * ) plafIncomingPortReadThread, ( void * ) dlmsInstance))
        {

            plafFree(plafParams);
            return FAILURE;
        }

        //create thread to read from platform (to monitor wrapperRecv() process)
        pthread_attr_init(&plafParams->EventthreadAttr);
        pthread_attr_setdetachstate(&plafParams->EventthreadAttr, PTHREAD_CREATE_JOINABLE);
        pthread_attr_setstacksize(&plafParams->EventthreadAttr, 16384);

        if( pthread_create(&plafParams->EventThreadHandle_p, &plafParams->EventthreadAttr, ( void * ) IncomingPortEventReadHandling, ( void * ) dlmsInstance))
        {
            pthread_attr_destroy(&plafParams->readThreadAttr);
            plafParams->eventThreadFlag = 0;
            return FAILURE;
        }



static JavaVM *jvm;

// Caching the JVM on JVM OnLoad
jint JNI_OnLoad(JavaVM* vm, void* reserved) 
{
    JNIEnv* jenv;
    version = (*vm)->GetEnv(vm, (void **) &jenv, JNI_VERSION_1_6);
    jvm = vm;
    printf("\n jvm = %d \n",rs);
    if(rs == JNI_OK) {
        printf("\n JNI_OK \n");
    }
}

回调函数

void GetEvent(unsigned char *msg)
    {

        printf("\n Processing event data \n");
        JNIEnv *env;

        printf("\n Before attaching JVM thread \n");
        jint rs = (*jvm)->AttachCurrentThread(jvm, &env, NULL); // JVM crashes here, tried with jint rs = (*jvm)->AttachCurrentThread(jvm, (void **) &env, NULL), nothing helps
        printf("\n After attaching JVM thread \n");

    }

在接收事件时执行 GetEvent() 后,我的 JVM 在 AttachCurrentThread() 函数调用上崩溃。 有人可以帮我找出问题吗? 提前致谢,如有任何建议,我们将不胜感激。

问候,

萨拉瓦南 G

【问题讨论】:

  • 需要更多信息,例如完整示例或至少崩溃日志,才能找出问题所在。附带说明一下,不需要jint rs = (*jenv)->GetJavaVM(jenv, &jvm);,您可以使用为您提供的JavaVM* vm 指针onload。例如:jvm = vm;
  • 谢谢亚历克斯。我已经删除了用 jvm = vm 替换的 GetJavaVM() 函数

标签: java c callback java-native-interface


【解决方案1】:

我猜你的线程已经可以附加到虚拟机了,所以不需要 AttachCurrentThread。也许你只需要像这样检查线程状态:

How to obtain JNI interface pointer (JNIEnv *) for asynchronous calls

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2014-12-19
    相关资源
    最近更新 更多