我正在为c库编写一个jna包装器,在cygwin下使用gcc编译。根据我执行jna包装器的方式,java应用程序要么挂起(如果在eclipse下作为单元测试执行),要么以无效内存异常终止。问题似乎只发生在c库向stdout或stderr写入内容。 这是我的最小(非)工作示例:
add.c
#include <stdio.h>
int add (int x, int y)
{
fprintf(stdout, "hello world\n" );
return x + y;
}
jna wrapper
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 :(得分:0)
fprintf
使用了错误的语法。实际上是
int fprintf(FILE *restrict stream, const char *restrict format, ...);
您还需要传递字符串格式说明符(%s
)。