문제

C (편집 할 수없는)로 작성된 DLL이 있습니다.

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

DLL에 JNA 인터페이스를 만들고 싶습니다. 파일 *막대 인수를 위해 무엇을 전달 해야하는지 확실하지 않습니다. 나는 입력 스트림을 통과해야한다고 가정하지만 (이는 내가 선호하는) JNA 문헌은 그 주제에 대해 드물게 보인다.

Java 인터페이스는 어떻게 생겼습니까? 그리고 정말로 Foo에게 전달해야합니까?

편집 : Foo는 막대가 fopen의 결과라고 가정하고 fscanf와 같은 작업을 호출합니다.

편집 2 : 궁극적으로, 나는 자바에 문자열이 있습니다. 마치 파일 인 것처럼 C에서 읽어야합니다 (완전히 다른 질문 일 수 있음). 이상적으로는 파일 작성을 피하고 싶습니다. 따라서 입력 스트림을 C 파일 포인터로 변환하는 것이 매우 바람직합니다 (그리고 분명히 매우 어렵습니다).

도움이 되었습니까?

해결책

나는 당신이 이것을 할 수 있다고 믿지 않습니다 - 당신은 내부에 접근 할 수있는 쉬운 방법이 없습니다. InputStream 인스턴스, 심지어 a FileInputStream STDIO 파일 위에 구현되지 않을 가능성이 높습니다. Java 인터페이스가 어떤지 확인하려면 foo 기능 - 그것이하는 일과 사용 방법.

당신이 무엇을 신경 쓰지 않는다면 FILE * 실제로, 당신은 JNA를 사용하여 코드를 호출 할 수 있습니다. fopen, 파일 이름과 열기 모드를 전달하고 결과를 불투명 값으로 전달합니다. foo, 예 : (슈도 코드) :

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

업데이트: 파일에있는 것처럼 취급 해야하는 데이터가 포함 된 문자열이 필요한 경우 운이 좋지 않다고 생각합니다. 불행히도, 표준 C 라이브러리는 스트림 추상화 위에 구축되지 않았으므로 파일 이름처럼 보이는 것을 열 수 없지만 문자열 데이터로 이어질 수 없다면 원하는 것을 달성 할 수 없을 것입니다. 그러나 총알을 물고 문자열을 임시 파일로 저장하는 것이 훨씬 쉬울 것입니다. fopen :-(

다른 팁

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;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top