我的JNIEnv指针在哪里?

时间:2015-06-03 23:16:25

标签: java c++ pointers java-native-interface

所有

我很难用一些C ++ JNI代码。我有一个长时间运行的线程,它处理从我们系统的其他部分推送到Java组件的东西。

这里是我的代码......线程是" HandleUpdateNotification",你可以看到我调用一个函数来获取必要的java引用......

static void getJavaStuff(JavaVM*& jvmp, JNIEnv*& env){
    jint nSize =1;
    jint nVMs;
    jint nStatus = JNI_GetCreatedJavaVMs(&jvmp, nSize, &nVms);

    if(nStatus == 0){
      nStatus = jvmp->AttachCurrentThread((void**) &env, NULL);
      if(nStatus != 0){
          //throw error
      }
    }
}

static int HandleUpdateNotification(void *param)
{
   JavaVM* jvmp = NULL;
   JNIEnv *env = NULL;
   getJavaStuff(jvmp, env);

  while(true){
      //why would env be null here?
      if(env == NULL)
          getJavaStuff(jvmp, env);


      //do stuff with env pointer as I get stuff from other parts 
      //of my system, however I never set env
  }
  jvmp->DetachCurrentThread();
  return 0;
}

如您所见,我在循环中检查env是否已设置为NULL。这是因为我在运行了几个小时之后发现,env会突然被设置为NULL,这会导致我在稍后尝试在线程中使用它时出现段错误(引用空指针)并且会导致VM崩溃。所以,我添加了支票,并将重新获得一切。问题是还没有解决它......现在,我得到了一个新的指针,但它是虚假的......程序仍然是段错误的,当我分析核心文件时,我看到我确实无法访问* env指针。

有没有人经历过这样的事情并知道如何打击它?

平台是: java版" 1.7.0_25" OpenJDK运行时环境(IcedTea 2.3.10)(7u25-2.3.10-1ubuntu0.12.04.2) OpenJDK客户端VM(构建23.7-b01,混合模式,共享)

0 个答案:

没有答案