Android JNI AttachCurrentThread泄漏了JAVA线程

时间:2014-03-11 19:09:12

标签: android multithreading android-ndk java-native-interface

我的应用程序从本机线程到java进行多次调用,我看到应用程序的内存使用量逐渐增加。看起来连接和分离的调用导致JAVA泄漏线程。我可以通过运行DDMS内存分析器来看到这一点。

我写了一个非常简单的测试应用程序来演示我的问题,从JAVA调用start测试并启动线程。它没有做任何事情,然后附加然后分离工作线程。

void detachFromThread(JavaVM *vm)
{

  if(vm != NULL)
  {
      vm->DetachCurrentThread();
  }
  else
  {

      __android_log_write(ANDROID_ LOG_ERROR, "JNI", "JNIUtils detachFromThread invalid VM passed in");
  }
}

JNIEnv* attachToThread(bool &attached, JavaVM *vm)
{
    JNIEnv *theJNIEnv(NULL);

    attached = false;

    if(vm != NULL)
    {
        jint result = vm->GetEnv((void **)& theJNIEnv, JNI_VERSION_1_6);

        if (result != JNI_OK)
        {
            vm->AttachCurrentThread(&theJNIEnv, NULL);

            if(theJNIEnv->ExceptionCheck())
            {
                theJNIEnv->ExceptionDescribe();
                theJNIEnv->ExceptionClear();

        __android_log_write(ANDROID_ LOG_ERROR, "JNI", "JNIUtils attachToThread failed to attach");

                theJNIEnv = NULL;
            }
            else
            {
                attached = true;

            }
        }
    }
    else
    {
        __android_log_write(ANDROID_ LOG_ERROR, "JNI", "JNIUtils attachToThread invalid VM passed in");
    }

return theJNIEnv;
}

bool checkForJNIException(JNIEnv * theJNIEnv)
{

    bool ret = false;

    if(theJNIEnv->ExceptionCheck())
    {

        ret = true;

        __android_log_write(ANDROID_ LOG_ERROR, "JNI", "JNI Error occurred");

        theJNIEnv->ExceptionDescribe();

        theJNIEnv->ExceptionClear();
    }

return ret;

}

void workerFunc(int noLoops)
{
    for(int i = 0; i < noLoops; i++)
    {

        bool attached(false);

        JNIEnv *testEnv = attachToThread(attached, g_vm);

        if(attached)
            detachFromThread(g_vm);

        boost::posix_time::milliseconds sleepTime(1+ (rand()%(100)));

        boost::this_thread::sleep(sleepTime);

    }
}

void Java_com_example_testapp_ jnithreadtest_startTest(JNIEnv* env, jobject javaThis, int noLoops, int noThreads)
{
    for(int i = 0; i < noThreads; i++)
        boost::thread workerThread(workerFunc, noLoops);

}

我错过了什么,我是否需要释放其他东西。

0 个答案:

没有答案