当前位置: 首页 > 面试题库 >

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

卞嘉许
2023-03-14
问题内容

我想在C中分配一些内存,并使其与Java对象实例相关联,如下所示:

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

然后在Java对象被垃圾回收时释放内存-我可以通过从Java对象的 finalize() 方法调用JNI函数来实现。

问题是,如何将C指针与java对象关联?在对象中保留一个 字段并将指针强制转换为 long ?有没有更好的办法?


问题答案:

通常,如果要将指针从C转移到Java,建议使用,long以便在平台为64位的情况下,有足够的位来保存指针值。

然后,看看ByteBuffer.allocateDirect()哪个ByteBuffer实例创建了一个可以与C共享内存的实例。您可以ByteBuffer从Java端分配这样的直接指令,然后将其作为A
jobject传递给JNI函数,并在此JNI函数内部使用该GetDirectBufferAddress函数。

另一种方法是NewDirectByteBuffer从本机端使用JNI函数包装内存的本机区域。它使您jobject可以回到Java端(注意本地和全局引用)。请注意以下事实:一旦ByteBuffer创建了包装本机内存的直接目录,您仍需负责管理本机内存:在某些时候,您将必须调用delete buf;本机代码,Java不会为您完成此操作。



 类似资料:
  • 我有一堆运行程序,我想通过线程池来执行。然而,每个运行程序也会将一些结果写入一些文件。所以现在,运行程序的界面很简单: 然而,我想要的是将一个BufferedWriter(换句话说,一个输出文件)与Executor池中的每个线程相关联。但是,我正在调用功能,如下所示: 我不知道执行器将分配哪个线程来运行给定的任务,所以我不知道应该向runnable提供哪个BufferedWriter。如何确保Ex

  • Kubernetes 中的各个 Object 的配置指南。

  • 随着 Jekyll 被更广泛的使用,一系列的教程、框架、扩展、示例和其他各种有用的资源也相继出现。下面列出了一些最流行的 Jekyll 资源合辑的链接。 Jekyll 提示和技巧,以及示例 与 GitHub Pages 集成的技巧 重用代码并保持文档同步至最新的示例。 使用 Simple Form 来集成一个简单的联系表单 JekyllBootstrap.com 提供了详细的解释,例子和辅助代码让

  • Windows 命令行界面 cmder 的官方网站 宁皓网《命令行》视频课程 宁皓网《我的工作流程:Windows》视频课程里的命令行 宁皓网《我的工作流程》视频课程里的终端

  • Atlassian:Learn Git Git 远程服务 Github,国外服务商,公开仓库免费,私有仓库收费 Coding.net,国内服务商,提供免费的公开与私有仓库 阿里云 Git,国内服务商,提供免费的公开与私有仓库 Atlassian,国外服务商,提供免费的公开与私有仓库

  • Digital Ocean:How To Use Rsync to Sync Local and Remote Directories on a VPS Tecmint:10 Practical Examples of Rsync Command in Linux