【问题标题】:Avoiding memory leaks in jni code避免 jni 代码中的内存泄漏
【发布时间】:2015-05-14 03:38:00
【问题描述】:

我正在编写一个 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*,从而导致内存泄漏。

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

【问题讨论】:

  • 是什么让您认为代码导致内存泄漏?
  • 你知道什么是 const char* 吗?
  • 指向 const 字符串的指针
  • 我猜你的意思是我可以创建任意数量的 const char*,并且不需要释放删除它们。
  • @CaptainObvlious 当我为较小的输入字符串运行我的代码时它工作正常,但是当我测试我的较大字符串输入的代码时它显示此错误 JNI ERROR (app bug): local reference table overflow (max =512) 并且添加到 JNI 本地引用表失败(有 512 个条目)

标签: java c++


【解决方案1】:

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

我不知道 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);

【讨论】:

  • 但是在 //std::string 到 jstring 中应该做什么,因为 const char* 仍然形成并且没有释放
  • std::string 的 c_str() 方法不会将内存的所有权授予调用者。对象仍然对其负责。所以没什么好担心的。
  • 我也在循环中使用这个函数 "a = env->CallStaticObjectMethod(integerClass, value, sub, radix);" .我还用这个“env->DeleteLocalRef(a);”删除了“a”外部循环。但看起来在这个循环中创建了多个对象并且永远不会空闲
猜你喜欢
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
  • 2018-04-08
  • 2013-06-24
相关资源
最近更新 更多