我有一个用C编写的DLL(我无法编辑),它有一些看起来像
的函数原型#include <stdio.h>
void foo(FILE *bar);
我想创建一个DLL的JNA接口,我不清楚我需要为FILE * bar参数传递什么。我假设我需要传递一个InputStream(这是我的偏好),但JNA文献似乎很少涉及这个主题。
Java界面会是什么样子?我真的需要传递给foo?
编辑:foo假设bar是fopen的结果并调用fscanf之类的操作。
编辑2:最终,我在Java中有一个字符串,我需要在C中读取,就好像它是一个文件一样(完全可能是一个不同的问题)。理想情况下,我想避免编写文件,这就是为什么将InputStream转换为C文件指针是如此理想(显然非常困难)。
答案 0 :(得分:3)
我不相信你可以做到这一点 - 你没有简单的方法来访问InputStream
实例的内部,甚至FileInputStream
很可能不会在stdio文件*。要查看您的Java界面应该是什么样的,您需要发布更多关于foo
函数的信息 - 它的作用以及如何使用它。
如果您不关心FILE *
实际执行的操作,可以使用JNA编写代码来调用fopen
,传入文件名和打开模式,并将结果作为不透明传递值到foo
,例如(伪代码):
path = "MyFile.txt";
bar = Libc.fopen(path, "r");
Libfoo.foo(bar);
更新:如果您需要一个包含您需要处理的数据的字符串,就好像它在文件中一样,我认为您运气不好。不幸的是,标准C库并不是建立在流抽象之上,这意味着你不可能实现你想要的东西,除非你可以打开看起来像文件名但会导致你的字符串数据;然而,咬住子弹并将字符串保存到临时文件会更容易,然后用fopen
打开它: - (
答案 1 :(得分:0)
在POSIX系统上,您可以使用管道执行此操作,只要字符串不太长(不幸的是“太长”取决于操作系统的特性,但至少是512字节):
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int string_to_foo(const char *str, size_t len)
{
int pipefd[2];
FILE *infile;
if (len > PIPE_BUF)
{
/* Error - string possibly too long */
return -1;
}
if (pipe(pipefd))
{
/* Error - pipe() failed */
return -1;
}
if (write(pipefd[1], str, len) < len)
{
close(pipefd[0]);
close(pipefd[1]);
/* Error - write() failed */
return -1;
}
close(pipefd[1]);
infile = fdopen(pipefd[0], "r");
if (!infile)
{
close(pipefd[0]);
/* Error - fdopen() failed */
return -1;
}
foo(infile);
fclose(infile);
return 0;
}