当前位置: 首页 > 知识库问答 >
问题:

attachCurrentThread JNI回调调用时JVM崩溃

柯昆杰
2023-03-14

希望你做得很好。

我有一个C语言的JNI实现,其中一个C函数连接到当前JVM线程并回调一个Java方法,这实际上是在attachCurrentThread()函数调用时使JVM崩溃。我的实现基于链接中给出的答案,保持对JNIEnv环境的全局引用

线程创建部分,它将侦听套接字连接以接受事件并注入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在AttachMoney tThread()函数调用时崩溃。有人能帮我找出问题吗?事先感谢,如有任何建议,将不胜感激。

问候,

萨拉瓦南G

共有1个答案

习狐若
2023-03-14

我猜你的Thread已经可以附加到VM了,所以不需要AttachMoney tThread。也许你只需要像这样检查线程状态:

如何获取异步调用的JNI接口指针(JNIEnv*)

 类似资料:
  • 我目前正在使用OpenGL和GLFW开发一个跨平台的2D渲染引擎。我有一个名为GameWindow的基本窗口类,以及一个名为Game的继承GameWindow的类。游戏覆盖了基类中的一些虚拟方法,以便GameWindow可以处理帧限制等。在GameWindow的构造函数中,我使用glfwSetWindowSizeCallback指定窗口调整大小时要运行的方法。然后,此方法调用GameWindow的

  • 问题内容: 我有一个第三方.NET Assembly和一个大型Java应用程序。我需要从Java应用程序调用.NET类库提供的方法。该程序集不支持COM。我已经搜索过网络,到目前为止,我有以下内容: C#代码(cslib.cs): 编译使用(使用.net 3.5,但使用2.0时也会发生同样的情况): C ++代码(clib.cpp): (使用VC 2008工具进行编译),但使用2003工具时也会发

  • 问题内容: 一天前,经过几个月的正常工作,我们的Java应用偶尔会因以下错误而崩溃: 我查看了hs_err_pid2075.log,发现有一个活动线程正在处理网络通信。但是,最近几个月没有进行任何应用程序或环境更改。也没有任何负载增长。我该怎么做才能了解崩溃的原因?有没有一些通用的步骤来调查jvm崩溃? UPD http://www.wuala.com/ubear/public 问题答案: 崩溃发

  • 我有以下设置: docker集线器上的docker映像Kubernetes集群(有4个节点,每个节点大约50GB RAM)和大量资源 我按照教程将图像从dockerhub拉到kubernetes 这导致pod进入< code>CrashLoopBackoff < code > docker run-it-p 8080:9546 OMG/telperion 工作正常。 所以我的问题是这个可以调试吗?

  • 我有一个Selenium集线器,其中6个节点基于该平台注册如下: > 3平台作为WIN10 3平台作为VISTA 有没有办法通过提及OSname在平台上调用chrome浏览器,我已经尝试了几个选项,但看起来集线器随机调用驱动器而不是基于操作系统版本。 任何洞察都会有所帮助。在某些情况下,当我提到WIN10的chrome驱动程序时,chrome驱动器崩溃,如下所示: 节点注册如下: 和 如果能帮助解

  • 问题内容: 这是启动桌面版本时得到的: 我都试过这个政党成员和这一个,我也得到了同样的错误在同一直线上。 编辑: 我只是注意到我的.tmx文件的数据是由Tiled Map Editor自动编码的,所以我只是停用了它,但仍然遇到相同的错误。 如果我复制/粘贴该项目(我的意思是整个项目,不仅是render()方法),它会工作,但是当我尝试在自己的项目中加载自己的地图时,它只会崩溃… 因此,在那之后,我