避免jni代码中的内存泄漏

时间:2015-05-14 03:38:01

标签: java c++

我正在编写一个jni代码,我必须经常将std :: string转换为jstring,反之亦然,我正在使用以下函数

//std::string to jstring

const char *cons_ref = ANY_STD_STRING.c_str();

jstring jref = env->NewStringUTF(cons_ref);

//jstring to std::string

const char *cons_ref = env->GetStringUTFChars(ANY_JSTRING, 0);

std::string ANY_STD_STRING = cons_ref

但是这导致了很多const char *的创建,它们是只读的,无法删除,从而导致内存泄漏。

是否有更好的技术来进行这些转换以避免内存泄漏。提前致谢。

1 个答案:

答案 0 :(得分:2)

每当你处理返回指针的东西时,你应该查看该函数的文档。理想情况下,它应该告诉您是否负责释放/释放该内存。如果是这样,它应该告诉你如何。

我不知道JNI,但通过一些谷歌搜索,我找到了http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html

在该页面上说:

  

const char * GetStringUTFChars(JNIEnv * env,jstring string,jboolean   完成后将* isCopy);

     

返回指向表示字符串的字节数组的指针   修改了UTF-8编码。此数组在释放之前有效   ReleaseStringUTFChars()。

所以听起来你应该这样做:

//jstring to std::string

const char *cons_ref = env->GetStringUTFChars(ANY_JSTRING, 0);

std::string ANY_STD_STRING = cons_ref;

env->ReleaseStringUTFChars(ANY_JSTRING, cons_ref);