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、stdioFILE*の上に実装されていない可能性があります。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 に答える