我有一个用 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
打开它会容易得多:-(