2014-10-31 86 views
1

希望你做得很好。JVM崩溃attachCurrentThread JNI回调调用

我在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的执行()在接收到的事件时,我的AttachCurrentThread JVM崩溃()函数调用。 有人能帮我找出问题吗? 在此先感谢和任何建议将不胜感激。

问候,

Saravanan摹

+0

更多信息需要有搞清楚什么地方出了错的希望。在附注中,'jint rs =(* jenv) - > GetJavaVM(jenv,&jvm);''不需要,您可以使用为您提供的'JavaVM * vm'指针onload。EX:'jvm = vm;' – 2014-10-31 16:58:02

+0

谢谢亚历克斯。我已经删除了用jvm = vm替换的GetJavaVM()函数 – srvnn 2014-11-01 09:36:52

回答