JNI memory management using the Invocation API

When I'm building a java object using JNI methods, in order to pass it in as a parameter to a java method I'm invoking using the JNI invocation API, how do I manage its memory? Here's what I am working with: I have a C object that has a destructor method that is more complex that `free()`. This C object is to be associated with a Java object, and once the application is finished with the Java object, I have no more need for the C object. I am creating the Java object like so (error checking elided for clarity): c_object = c_object_create (); class = (*env)->FindClass (env, "my.class.name"); constructor = (*env)->GetMethodID (env, class, "", "(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); So, now that I'm done with `instance`, what do I do with it? Ideally, I'd like to leave the garbage collection up to the VM; when it's done with `instance` it would be fantastic if it also called `c_object_destroy()` on the pointer I provided to it. Is this possible? A separate, but related question has to do with the scope of Java entities that I create in a method like this; do I have to manually release, say, `class`, `constructor`, or `method` above? The JNI doc is frustratingly vague (in my judgement) on the subject of proper memory management.

以上就是JNI memory management using the Invocation API的详细内容,更多请关注web前端其它相关文章!

赞(0) 打赏
未经允许不得转载:web前端首页 » JavaScript 答疑

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

前端开发相关广告投放 更专业 更精准