java - 通过 JNA 将 InputStream 作为文件指针传递给 C 代码

标签 java c file-io jna

我有一个用 C 编写的 DLL(我无法编辑),它有一些看起来像的函数原型(prototype)

#include <stdio.h>
void foo(FILE *bar);

我想为 DLL 创建一个 JNA 接口(interface),但不清楚我需要为 FILE *bar 参数传递什么。我假设我需要传递一个 InputStream(这是我的偏好),但 JNA 文献似乎很少涉及这个主题。

Java 界面会是什么样子?我真正需要传递给 foo 的是什么?

编辑:foo 假定 bar 是 fopen 的结果并调用 fscanf 等操作。

编辑 2:最终,我在 Java 中有一个字符串,我需要在 C 中读取它,就好像它是一个文件一样(这可能完全是一个不同的问题)。理想情况下,我想避免写入文件,这就是为什么将 InputStream 转换为 C 文件指针是如此可取(而且显然非常困难)。

最佳答案

我不相信你能做到这一点 - 你没有简单的方法来访问 InputStream 实例的内部,甚至 FileInputStream 也很可能不会在 stdio FILE * 之上实现。要了解您的 Java 界面应该是什么样子,您需要发布更多关于 foo 函数的信息 - 它的作用以及您如何使用它。

如果您不关心FILE * 实际做什么,您可以使用JNA 编写代码来调用fopen,传入文件名和打开模式,并将结果作为不透明值传递给 foo,例如(伪代码):

path = "MyFile.txt";
bar = Libc.fopen(path, "r");
Libfoo.foo(bar);

更新:如果您需要一个字符串,其中包含您需要将其视为文件中的数据,我认为您运气不好。不幸的是,标准 C 库不是建立在流抽象之上的,这意味着您不太可能实现您想要的,除非您可以打开看起来像文件名但会导致您的字符串数据的内容;但是,硬着头皮将字符串保存到临时文件,然后使用 fopen 打开它会容易得多:-(

关于java - 通过 JNA 将 InputStream 作为文件指针传递给 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1337525/

相关文章:

c# - 即使子目录不存在,如何创建文件

Java异步发布数据结构

java - 在 libGDX 中设置延迟

c++ - 算术运算是否会受到编译器优化的影响?

c - 不使用 va_list 实现 printf

c++ - 从被调用者的角度来看,如何检测内存是动态的还是静态的?

javascript - 使用 Javascript 强制下载图像

java - Java 中的 NodeXl 工具包

java - 使用参数调用 Java 应用程序,但从不等待答案

java - 通过 BufferedReader 读取文件时 while 循环不退出