JNI释放内存以避免内存泄漏

所以我有这个C ++程序,它是通过Java程序中的JNI调用的,代码如下:

    JNIEXPORT jstring JNICALL Java_com_entrust_adminservices_urs_examples_authn_LdapAuthenticator2_takeInfo(JNIEnv *env, jobject obj, jstring domain, jstring id, jstring idca, jstring password) 

{

const char *nt_domain;

const char *nt_id;

const char *nt_password;

HANDLE hToken = 0;

bool aut = false;

nt_domain = env->GetStringUTFChars(domain, NULL);

nt_id = env->GetStringUTFChars(id, NULL);

nt_password = env->GetStringUTFChars(password, NULL);

aut = LogonUser(nt_id, nt_domain, nt_password, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &hToken );

/* release buffers */

env->ReleaseStringUTFChars(domain, nt_domain);

env->ReleaseStringUTFChars(id, nt_id);

env->ReleaseStringUTFChars(password, nt_password);

/* release the login handle */

CloseHandle(hToken);

if(aut)

{

return env->NewStringUTF("true");

}

DWORD dwError = GetLastError();

LPVOID lpMsgBuf;

FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT ), (LPTSTR) &lpMsgBuf, 0, NULL );

return env->NewStringUTF((const char*)lpMsgBuf); //returns the contents of lpMsgBuf (error)

}

在倒数第二行jstring newString = env->NewStringUTF((const

char*)otherString);中,从不释放而是返回,是否会导致最终的内存泄漏" title="内存泄漏">内存泄漏?反正有解决这个问题的方法吗?

还有可能不是返回字符串而是返回布尔值(由LogonUser函数返回),而不是jstring,而是添加了要在方法中传递的“

errormessage”引用,并更新了它?我的Java程序能否看到“ errormessage”的更新?

谢谢。

回答:

NewStringUTF() 创建一个新的java.lang.String-换句话说,就是Java堆上的一个对象,当不再有对其的引用时,它将被收集。

还是您在问otherString?我不知道该怎么办FormatMessage,但看起来它正在C堆上分配内存。如果是这样,那么是的,您必须显式释放该内存。

有时设置otherString为常量字符串会使您的生活更加艰难。不要那样做 相反,请NewStringUTF()在if /

else的块中调用,然后在第二种情况下释放本机C字符串。

以上是 JNI释放内存以避免内存泄漏 的全部内容, 来源链接: utcz.com/qa/407152.html

回到顶部