相关疑难解决方法(0)

使用Invocation API进行JNI内存管理

当我使用JNI方法构建java对象时,为了将其作为参数传递给我正在使用JNI调用API调用的java方法,我该如何管理它的内存?

这是我正在使用的:

我有一个C对象,它有一个更复杂的析构函数方法free().这个C对象与Java对象相关联,一旦应用程序完成Java对象,我就不再需要C对象了.

我正在创建这样的Java对象(为了清楚起见,错误检查已被省略):

c_object = c_object_create ();
class = (*env)->FindClass (env, "my.class.name");
constructor = (*env)->GetMethodID (env, class, "<init>", "(J)V");
instance = (*env)->NewObject (env, class, constructor, (jlong) c_object);

method = (*env)->GetMethodID (env, other_class, "doSomeWork", "(Lmy.class.name)V");
(*env)->CallVoidMethod (env, other_class, method, instance);
Run Code Online (Sandbox Code Playgroud)

那么,既然我已经完成了instance,我该怎么办呢?理想情况下,我想将垃圾收集器留给VM; 当它完成时instance它会很棒,如果它也调用c_object_destroy()我提供给它的指针.这可能吗?

一个单独但相关的问题与我在这样的方法中创建的Java实体的范围有关; 我必须手动释放,也就是说,class,constructor,或method以上?关于适当的内存管理问题,JNI文档令我感到沮丧(在我看来).

c java java-native-interface memory-management

6
推荐指数
2
解决办法
1万
查看次数

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

我试图将一个字节数组(随机数据)从本机传递到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内存管理?

c++ java java-native-interface memory-leaks native

2
推荐指数
1
解决办法
2431
查看次数