4

我有一个用 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 文件指针如此可取(而且显然非常困难)的原因。

4

2 回答 2

3

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

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

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

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

于 2009-08-26T21:33:51.177 回答
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;
}
于 2009-08-27T07:07:32.053 回答