我想调用此函数:
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指针异常,此代码失败。 你有什么想法吗?
答案 0 :(得分:1)
所有JNA Structure
参数默认为引用(struct*
)语义。
当作为结构成员出现时,它们默认为值语义。
提供ByReference
和ByValue
标记接口,供您在需要补充行为的地方使用。如果默认行为符合您的要求,则您不需要额外输入。
你应该总是为你定义的Pointer
提供一个基于Structure
的构造函数,它避免了JNA多余的内存分配。