Question

J'ai une DLL écrite en C (que je ne peux pas modifier) qui a une fonction de prototype qui ressemble à

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

J'aimerais créer un JNA interface à la DLL et il est difficile de savoir ce que j'ai besoin de passer par le FICHIER *barre d'argument.Je suppose que j'ai besoin de passer un InputStream (qui a ma préférence), mais la JNA de la littérature semble éparses sur le sujet.

Ce serait de l'interface Java ressembler?et de quoi ai-je vraiment besoin de passer à toto?

Edit:foo suppose bar est le résultat d'un fopen et les appels d'opérations comme fscanf.

Edit 2:En fin de compte, j'ai une chaîne de caractères en Java que j'ai besoin de lire dans C comme si il s'agissait d'un fichier, (qui pourrait être une autre question qui est tout).Idéalement, j'aimerais éviter d'écrire le fichier, c'est pourquoi la conversion d'un InputStream pour un C pointeur de fichier est donc souhaitable (et évidemment assez difficile).

Était-ce utile?

La solution

Je ne crois pas que vous pouvez ce faire, vous n'avez pas de moyen facile d'accéder à l'intérieur de d'un InputStream exemple, et même un FileInputStream ne sera probablement pas être implémenté sur un FICHIER stdio *.Pour voir ce que votre interface Java doit être, vous aurez besoin d'afficher plus au sujet de la foo la fonction de ce qu'il fait et comment vous l'utilisez.

Si vous ne se soucient pas de ce que l' FILE * en fait, vous pouvez code à l'aide de JNA à l'appel fopen, en passant le nom de fichier et le mode d'ouverture, et de transmettre le résultat comme une opaque valeur par le biais du foo, par exemple(pseudo-code):

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

Mise à jour: Si vous avez besoin d'une chaîne de caractères qui contient les données dont vous avez besoin traitée comme si elle était dans un fichier, je pense que vous êtes hors de la chance.Malheureusement, la bibliothèque standard C n'est pas construite sur le toit d'un flux d'abstraction, ce qui signifie que vous êtes susceptibles d'être en mesure d'obtenir ce que vous voulez, sauf si vous pouvez ouvrir ce qui ressemble à un nom de fichier, mais conduit à votre chaîne de données;cependant, il va être beaucoup, beaucoup plus facile à mordre la balle et enregistrer la chaîne de caractères dans un fichier temporaire, puis ouvrir qu'avec fopen :-(

Autres conseils

Sur les systèmes POSIX, vous pouvez le faire à l'aide d'un tuyau, tant que la chaîne n'est pas trop long (malheureusement "trop long" dépend des caractéristiques du système d'exploitation, mais est au moins de 512 octets):

#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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top