我正在编写一个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 *的创建,它们是只读的,无法删除,从而导致内存泄漏。
是否有更好的技术来进行这些转换以避免内存泄漏。提前致谢。
答案 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);