2011-11-08 64 views
0

我有以下C++代码:JNA - 结构创建错误

typedef struct { 
    int TabSock[1024]; 
    DWORD TabIP[1024]; 
    int NumSockConec; 
} TTABSOCK; 
typedef TTABSOCK *PTABSOCK; 

和一个功能:

TTABSOCK __stdcall mt_connectlist(void); 

上述功能是在DLL中。 我想使用JNA在Java中创建Struct,但我没有获得成功。当我尝试执行该本地函数时,我的程序会产生错误并关闭。

下面是我在Java/JNA的结构实现:

public class TTABSOCK extends Structure { 

    public int[] TabSock = new int[1024]; 
    public DWORD[] TabIP = new DWORD[1024]; 
    public int NumSockConec; 
} 

我在做什么错?

非常感谢。

回答

0

我想你不应该初始化数组...全息忘记它,它不应该成为问题..

public static class TTABSOCK extends Structure { 

    public int[] TabSock = new int[1024]; 
    public DWORD[] TabIP = new DWORD[1024]; 
    public int NumSockConec; 

    public static class ByReference extends TTABSOCK implements Structure.ByReference {}; 
    public static class ByValue extends TTABSOCK implements Structure.ByValue {}; 
} 
+0

嗨!不幸的是不起作用。 – eliangela

+0

如果被捕获,什么是异常? –

+0

当我调用该函数时,JVM崩溃。我和一些开发者交谈过,他们告诉我他们有同样的问题。我们相信DLL有一些错误。 我正在尝试另一个功能。 非常感谢 – eliangela

0

你需要确保你通过值返回的结构。默认情况下,JNA Structure在参数和返回类型中被视为“struct *”,所以在这种情况下,您需要指示您需要“struct”行为。

public interface MyLibrary extends StdCallLibrary { 
    class TTABSOCK extends Structure { 
     public static class ByValue extends TTABSOCK implements Structure.ByValue { } 
     // ... 
    } 
    TTBASOCK.ByValue mt_connectlist(); 
} 
+1

嗨!我尝试按价值返回结构,但不起作用。我和一些开发者交谈过,他们告诉我他们有同样的问题。我们相信DLL有一些错误。我解决了使用另一个功能。非常感谢。 – eliangela

+0

另一件要检查的是整体结构尺寸和对齐。如果这些代码在本地代码和Java代码之间不一致,那么按价值结构将不起作用。将本地代码中的“sizeof(TTBASOCK)”与Java中的TTBASOCK.size()进行比较。 – technomage