【问题标题】:How to free memory allocated by native method on Java side?如何在 Java 端释放本地方法分配的内存?
【发布时间】:2015-08-18 12:43:57
【问题描述】:

我正在尝试将一个字节数组(带有随机数据)从本机传递到 Java,但我不确定这是否会导致任何内存泄漏。这是 C++ 代码。

JNIEXPORT jbyteArray JNICALL Java_com_sample_test_jni_TestJNI_return_1byte_1array
(JNIEnv *env, jobject obj) {
  unsigned char *byteArray = new unsigned char[LENGTH];
  srand(12345);
  for(int i = 0;i < LENGTH;i++) {
    byteArray[i] = rand() % 64;
  }
  jbyteArray data = (env)->NewByteArray(LENGTH);
  env->SetByteArrayRegion(data, 0, LENGTH, (jbyte*)byteArray);
  delete(byteArray);
  return data;
}

这是 Java 代码。

class TestJNI {
  static {
    System.loadLibrary("foobar");
  }
  public native byte[] return_byte_array();
  public static void main(String[] args) {
    byte[] data = new TestJNI().return_byte_array();
    System.out.println("Data length " + data.length);
  }
}

我怀疑在本机代码中分配的 jbytearray 是否会被 Java 垃圾收集。我无法在原生端释放它。

另外,有没有很好的文档用示例描述 JNI 内存管理?

【问题讨论】:

  • 您没有检查来自NewByteArray 的返回。所以要么不检查结果有问题,要么有可能出现异常,这在这段代码中是不安全的。无论如何,只需使用std::vector 而不是显式的newdelete。另外,请记住,当您编写这样的探索代码时,能够验证结果是个好主意。因此,不要使用随机数,而是用可识别的值填充数组。
  • 感谢您的建议。您能否稍微描述一下您所说的“有例外的可能性”是什么意思?我应该对 NewByteArray 做什么检查?
  • 您只需要阅读文档。我不知道NewByteArraysignals 是如何失败的。 15年前我确实知道,但今天不知道。但是有失败的可能,所以有一些失败的指示机制。

标签: java c++ memory-leaks java-native-interface native


【解决方案1】:

Java GC 应该清理您分配的所有对象。

更多详情请见this answer

【讨论】:

    猜你喜欢
    • 2019-04-11
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 2020-11-09
    相关资源
    最近更新 更多