파일 포인터로 JNA를 통해 C 코드로 inputStream을 통과
문제
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;
}