2013-10-09 1 views
1

cygwin에서 gcc를 사용하여 컴파일 된 c 라이브러리 용 jna 래퍼를 작성하고 있습니다. jna 래퍼를 실행하는 방법에 따라 Java 응용 프로그램이 중단되거나 (일식 아래 단위 테스트로 실행되는 경우) 잘못된 메모리 예외로 종료됩니다. 문제는 C 라이브러리가 stdout 또는 stderr에 무언가를 씁니다. 다음과 같이JNA stdout에 쓸 때 유효하지 않은 메모리 액세스

add.c

#include <stdio.h> 

int add (int x, int y) 
{ 
    fprintf(stdout, "hello world\n"); 
    return x + y; 
} 

JNA 래퍼

public interface Add extends Library 
{ 
    Add INSTANCE = (Add) Native.loadLibrary("add", Add.class); 
    int add(int x, int y); 
} 

Cygwin에서 아래에있는 C 파일을 컴파일 : 여기 내 최소 (안) 작업 예입니다

gcc -g -Wall -c add.c 
gcc -shared -o add.dll add.o 

fprintf 줄을 제거하면 모든 것이 잘 작동합니다. add.dll과 cygwin1.dll은 모두 java 대상 폴더에 있습니다.

+0

추가 질문없이 100 % 정확한 예제를 사용하면 설명하는 동작 (멈춤 또는 충돌)이 발생할 수 있습니까? – alk

+0

JVM에서 cygwin을 재생하려고하지 않는 것이 좋습니다. gcc <4는'-mno-cygwin'을 사용하거나, mingw를 사용하여 cygwin 의존성없이 컴파일 할 수 있습니다. – technomage

+0

@technomage 이것은 내가 한 일로, 방금 VS2010으로 라이브러리를 컴파일했습니다. 지금까지 모든 것이 잘 작동합니다. – Krassi

답변

0

fprintf에 대해 잘못된 구문을 사용하고 있습니다. 그것은 당신이 너무 문자열 형식 지정자 (%s)를 통과해야

int fprintf(FILE *restrict stream, const char *restrict format, ...);

사실이다.