如何通过JNA引用传递结构

时间:2016-07-26 21:22:49

标签: java c++ structure jna

我想调用此函数:

extern "C" xxx_SERVICE_API int  initSocket(socketStruct* skStruct); 
在c ++ dll.socketStruct中定义的

是下面定义的结构:

typedef struct 
{
    int a;
    int b;
} mystruct;

java中的等效代码是:

public interface MyDllClass extends Library {

    public static class MyStructure extends Structure {

        public static class ByReference extends MyStructureRef
        implements Structure.ByReference{ 


        }
        @Override
        protected List<String> getFieldOrder() {    

            return Arrays.asList(new String[]{"a","b"});
        }
        public int a;
        public int b;
    }
    //Native function
    int initSocket (MyStructure.ByReference sks); 
    MyDllClass INSTANCE = (MyDllClass)Native.loadLibrary("Mydll",  
    MyDllClass.class); 
}

如何通过引用作为参数将该结构称为本机功能? 谢谢

感谢您的回答。据我说,我在我的结构中添加了一个构造函数:

public interface MyDllClass extends Library {

    public static class MyStructure extends Structure {

       public MyStructure() {

            idModule = 0;
            nbModules = 0;
            nbQueueInModule = 3;
            portList = new int[128];
            serverList = new char[128][20]; 
        }
        @Override
        protected List<String> getFieldOrder() {    

            return Arrays.asList(new String[]{"a","b","portList","serverList"});
        }
        public int a;
        public int b;
        public int[] portList;
        public char[][] serverList;
    }
    //Native function
    int initSocket (MyStructure.ByReference sks); 
    MyDllClass INSTANCE = (MyDllClass)Native.loadLibrary("Mydll",  
    MyDllClass.class); 
}

主要是我写了这段代码:

MyStructure mySocket = new MyStructure();
MyDllClass.INSTANCE.initSocket(mySocket);

由于调用本机函数时出现Null指针异常,此代码失败。 你有什么想法吗?

1 个答案:

答案 0 :(得分:1)

所有JNA Structure参数默认为引用(struct*)语义。

当作为结构成员出现时,它们默认为值语义。

提供ByReferenceByValue标记接口,供您在需要补充行为的地方使用。如果默认行为符合您的要求,则您不需要额外输入。

你应该总是为你定义的Pointer提供一个基于Structure的构造函数,它避免了JNA多余的内存分配。