Java 避免jni代码中的内存泄漏

Java 避免jni代码中的内存泄漏,java,c++,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->GetStringUTF

我正在编写一个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*,它们是只读的,无法删除,从而导致内存泄漏


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

无论何时处理返回指针的内容,都应该查看该函数的文档。理想情况下,它应该告诉您是否负责释放内存。如果是这样,它应该告诉你怎么做

我不知道JNI,但通过谷歌搜索我发现

在那一页上写着:

const char*GetStringUTFChars(JNIEnv*env,jstring string,jboolean *iCopy)

返回指向表示字符串的字节数组的指针 改进的UTF-8编码。此数组在由发布之前一直有效 释放StringUTFChars()

所以听起来你应该做一些类似的事情:

//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);

是什么让你认为代码导致了内存泄漏?你知道什么是常量字符*吗?指向常量字符串的指针我想你的意思是我可以创建任意多的常量字符*,并且不需要删除它们。@CaptainObvlious当我为较小的输入字符串运行代码时,它工作正常,但是当我测试较大字符串输入的代码时,它显示了这个错误JNI error(app bug):本地引用表溢出(max=512)并且无法添加到JNI本地引用表(有512个条目),但是在//std::string to jstring中应该做些什么,因为const char*仍然是形式化的,而不是释放c_str()string的方法不会将内存的所有权授予调用方。对象仍然对此负责。所以没什么好担心的。我还在循环“a=env->CallStaticObjectMethod(integerClass,value,sub,radix);”中使用这个函数。我还用这个“env->DeleteLocalRef(a);”删除了“a”外部循环。但看起来多个对象是在这个循环中创建的,并且从来都不是自由的