JAVA JNI-将在C中分配的资源与Java对象相关联?

 2023-01-19    331  

问题描述

我想在C中分配一些内存并将其与Java对象实例保持关联,例如:

void configure(JNIEnv *object, jobject obj, ....) {
  char *buf = new char[1024];
  // associated <buf> with <obj> somehow
}

,然后在Java对象收集垃圾时释放内存 – 我可以通过从Java对象的 finalize()方法调用JNI函数来做到这一点.

问题是,如何将C指针与Java对象相关联?将A 字段保留在对象中,并将指针铸成 long ?有更好的方法吗?

JAVA JNI-将在C中分配的资源与Java对象相关联?

推荐答案

通常,如果要将指针从C转移到Java,建议使用long,以便有足够的位置可以保持指针值,以防平台为64位.

.

然后,看看 ByteBuffer.allocateDirect() 创建一个可以与C共享的内存的实例,您可以从Java侧分配此类直接ByteBuffer,然后将其作为a jobject传递给JNI函数在此jni函数内部,您可以使用 GetDirectBufferAddress 函数.

另一种方法是用 NewDirectByteBuffer jni函数来自天然侧.它为您提供了jobject,您将回到Java侧(请注意本地和全球参考).请注意以下事实:一旦创建了本机内存的直接ByteBuffer,您仍然负责管理本机内存:在某个时候,您必须在本机代码中调用delete buf;,Java won won ‘t为您做.

其他推荐答案

Java没有任何本机指针的概念,因此将其存储为长时间是唯一的真正选择.但是您不应依靠finalize来释放指针.最终化方法是清理资源的一种手段.有关更多详细信息

以上所述是小编给大家介绍的JAVA JNI-将在C中分配的资源与Java对象相关联?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/25906.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。