【问题标题】:JNA - Structure creation errorJNA - 结构创建错误
【发布时间】:2011-11-08 20:09:48
【问题描述】:

我有以下 C++ 代码:

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

还有一个功能:

TTABSOCK __stdcall mt_connectlist(void);

上面的函数在一个DLL中。 我正在尝试使用 JNA 在 Java 中创建该结构,但我没有成功。当我尝试执行本机函数时,我的程序出错并关闭。

以下是我在 Java/JNA 中对结构的实现:

public class TTABSOCK extends Structure {

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

我做错了什么?

非常感谢。

【问题讨论】:

    标签: java c++ dll struct jna


    【解决方案1】:

    我认为你不应该初始化数组...不,算了,这不应该是问题..

    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 {};
    }
    

    【讨论】:

    • 什么是异常,如果被捕获?
    • 当我调用该函数时 JVM 崩溃。我与一些开发人员交谈,他们告诉我他们有同样的问题。我们认为 DLL 存在一些错误。我正在尝试另一个功能。非常感谢
    【解决方案2】:

    您需要确保按值返回结构。默认情况下,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();
    }
    

    【讨论】:

    • 嗨!我尝试按值返回结构,但不起作用。我与一些开发人员交谈,他们告诉我他们有同样的问题。我们认为 DLL 存在一些错误。我用另一个函数解决了。非常感谢。
    • 要检查的另一件事是整体结构大小和对齐方式。如果这些在本机代码和 Java 代码之间不一致,则按值结构将不起作用。将本机代码中的“sizeof(TTBASOCK)”与 Java 中的 TTBASOCK.size() 进行比较。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多