如何释放Java端本机方法分配的内存?

til*_*mik 2 c++ java java-native-interface memory-leaks native

我试图将一个字节数组(随机数据)从本机传递到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;
}
Run Code Online (Sandbox Code Playgroud)

这是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);
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Bud*_*ddy 6

Java GC应该清理您分配的任何对象.

有关详细信息,请参阅此答案.