我的应用程序从本机线程到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);
}
我错过了什么,我是否需要释放其他东西。