2013-10-09 126 views
1

我写一个C库JNA包装,在cygwin下用gcc编译时JNA无效的内存访问。根据我如何执行该包装器JNA Java应用程序要么只是挂起(如果为下蚀单元测试执行)或者与无效存储器异常终止。问题似乎只发生在c库写入stdout或stderr的东西。 这是我最小的(不)工作示例:如下写到标准输出

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%准确的例子,没有你可能会产生你描述(挂起或崩溃)的行为的任何addtions? – alk

+0

我建议*不*试图与JVM的cygwin的发挥。 gcc <4可以使用'-mno-cygwin',或者你可以使用mingw在没有cygwin依赖的情况下进行编译。 – technomage

+0

@technomage这是我做的,我只是编译VS2010库。到目前为止一切正常。 – Krassi

回答

0

您正在使用错误的语法fprintf。它实际上是

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

您需要将字符串格式说明(%s)了。